为结构分配内存,有两种不同的方式?

时间:2016-02-22 14:46:28

标签: c

我是C新手,但不是编程新手。两组代码之间有区别吗?如果没有,是否有一个更喜欢的约定?是否有性能差异?

typedef struct
{
    int x;
    int y;
} something_t;

-

something_t* s;
s = malloc(sizeof(int)*2);
s->x = 1;
s->y = 1;

something_t* s;
s->x = 1;
s->y = 1;

3 个答案:

答案 0 :(得分:3)

根据我的理解,第一个版本应该是

something_t* s;
s = malloc(sizeof(something_t));
s->x = 1;
s->y = 1;

而不是手动摆弄个别成员的大小;第二个版本根本不执行任何分配并访问未初始化的内存。

答案 1 :(得分:3)

something_t* s;

不为您的结构分配任何内存,它只分配一个指针(到一个随机内存区域)。当您尝试读取/写入时,它很可能会触发分段错误。

分配记忆的好方法是

something_t* s;
s = malloc(sizeof(something_t));

或单行

something_t* s = malloc(sizeof(something_t));

完成后,请不要忘记使用free(s);

如果您想要堆叠分配,可以使用:

something_t s;
s.x = 2;
s.y = 2;

答案 2 :(得分:3)

这样做的好方法是

something_t *something;
something = malloc(sizeof(*something));
if (something == NULL)
    please_do_not_use_something_perhaps_return_NULL_or_quit();
something->x = 2;
something->y = 2;

这样,您可以确保大小正确且代码更易于维护。而且,您还可以通过检查malloc()未返回NULL给您机会对此做些什么来预防灾难。假设 no-errors 一直都是错误的,因为你永远不知道系统什么时候会用完RAM。

你的第二个例子不起作用,这个

something_t *something;
something->x = 2;
something->y = 2;

调用未定义的行为,其中一个可能的结果是“ Works ”。因此,您可能认为它因未定义的行为而起作用,但事实是,这是错误的。

在这种情况下something没有指向有效的内存,所以你不确定something的值是什么,它可以是任何东西,因此这样的程序的行为是不可预测的。

另外,read why you should avoid _t as a suffix for type names