gpt4 book ai didi

c - 减少 C 中返回/传递的数据结构的大小

转载 作者:太空宇宙 更新时间:2023-11-04 05:24:50 24 4
gpt4 key购买 nike

我正在 mit 在线学习操作系统类(class),我完成了第一个作业 http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/assignments/MIT6_828F12_assignment1.pdf
但让我感到惊讶的是他们如何返回数据结构,他们使用数据结构并返回一个较小的数据结构,并且为了使用它,他们只是将其转换回去。我看到它可以优化代码,但这安全吗?这是好习惯吗?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct small
{
int n ;
};

struct big
{
int n ;
char * string ;
};

struct small* f()
{
struct big* x = malloc(sizeof(struct big));
x->n = 'X';
x->string = strdup("Nasty!");
return (struct small*) x ;
}

int main(int argc, char *argv[])
{
struct big *y = (struct big*)f();
printf("%s\n",y->string);
}

编辑 1:这是来自 mit 的链接,我只是在自己的代码中复制了这个想法。 http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/assignments/sh.c

最佳答案

  1. 没有返回结构,而是一个指向结构的指针。指针包含实际对象所在的内存地址。 (在这种情况下,它是使用 malloc 动态分配的,因此具有动态存储持续时间,并且会一直存在,直到程序结束或在指针上调用 free。)

  2. 代码是合法的并且有定义的语义。 n1570草案的6.3.2.3/7说

    A pointer to an object type may be converted to a pointer to a different object type. If the resulting pointer is not correctly aligned for the referenced type, the behavior is undefined. [does not apply here. -ps] Otherwise, when converted back again, the result shall compare equal to the original pointer.

请注意,结构可以完全不相关(第一个数据元素不需要是同一类型)。强制转换甚至可以是像 int 这样的内置类型。

如果由于别名问题而通过错误类型的指针访问对象,问题可能会有所不同。

关于c - 减少 C 中返回/传递的数据结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34882527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com