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

Bar*_*wen 0 c

我正在线上学习操作系统课程,我完成了第一个课程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);
}
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*ica 5

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

  2. 代码是合法的,并定义了语义.n1570草案的6.3.2.3/7说

    指向对象类型的指针可以转换为指向不同对象类型的指针.如果生成的指针未针对引用的类型正确对齐,则行为未定义.[此处不适用.-ps]否则,当再次转换回来时,结果应该等于原始指针.

请注意,结构可能完全不相关(第一个数据元素不需要是相同的类型).演员阵容甚至可以是内置类型int.

如果由于别名问题而通过错误类型的指针(它不是)访问对象,则问题可能不同.