它在动态分配变量之前初始化变量有什么不同

时间:2015-03-19 07:23:37

标签: c malloc

请参阅代码:

struct something* s = malloc(sizeof(struct something));
s = NULL;

在这里,我在定义时动态地将内存分配给s。然后将其初始化为NULL

struct something* s = NULL;
s = malloc(sizeof(struct something));

在这里,我使用NULL值定义并初始化它,然后将其内存分配分配(更改)到动态内存。

它还有什么不同之处?如果我错了,请纠正我。

哪一个是不好的做法,如果有的话?

3 个答案:

答案 0 :(得分:7)

  

这里我在定义并将其初始化为NULL时动态地为s分配内存。

不,你不是。通过做

struct something* s = malloc(sizeof(struct something));
s = NULL;

你实际上放弃了NULL分配给内存的唯一指针(通过将其设置为malloc())。你在这里泄漏记忆。

如果你想初始化分配的内存,比如说0,你就要做

之类的事情
memset(s,0, sizeof(struct something));

然而,你的第二个片段

struct something* s = NULL;          //define and initialize to NULL
s = malloc(sizeof(struct something));  //allocate memory

完全有效且方法正确。你在这里

  • 定义s并指定NULL,以防止未经初始化使用。
  • 在使用前将内存分配给s
  

使用后不要忘记free()记忆。

完美!!

答案 1 :(得分:2)

这会创建对内存中某处的引用。

struct something* s = malloc(sizeof(struct something));

您正在销毁参考资料。

s = NULL;

答案 2 :(得分:0)

你的第一个代码中的问题是,如果malloc成功,你会得到一个地址,但是在之后删除它 - 通过asigning null而不是你得到的地址。

如前所述 - 你的第二个方法更好。 确保你处理一个不成功的内存分配案例 - 因为如果它失败你将得到意外的行为。 关于未初始化的指针 - 建议您在内存分配(以及分配成功检查)后立即启动数据。

E.G:

 struct something* s = malloc(sizeof(struct something))
 //alocating memory
 if(!s) return OUT_OF_MEMORY;
 //memory allocation failed, returning a proper messege
 /*DO SOMTHING WITH s*/