在动态分配变量之前初始化变量有什么区别

What difference it makes to initialize a variable before allocating it dynamically

请看代码:

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

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

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

在这里,我用 NULL 值定义和初始化它,然后分配(更改)它的内存分配给动态内存。

它还有什么不同?也请指正,如有不妥之处。

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

Here I am allocating memory to s dynamically while defining and then initializing it to NULL.

不,你不是。通过做

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

您实际上是在丢弃 malloc() 分配的唯一内存指针(通过将其设置为 NULL)。你在这里泄漏内存。

如果你想初始化分配的内存,比如说,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()使用后的记忆。

完美!!

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

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

你正在破坏引用。

s = NULL;

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

如前所述 - 你的第二种方法更好。 确保你处理了内存分配不成功的情况——因为如果失败你会得到意想不到的行为。 关于未初始化的指针 - 建议您在内存分配(和分配成功检查)后立即初始化数据。

例如:

 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*/