我是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;
答案 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
的值是什么,它可以是任何东西,因此这样的程序的行为是不可预测的。