请参阅代码:
struct something* s = malloc(sizeof(struct something));
s = NULL;
在这里,我在定义时动态地将内存分配给s
。然后将其初始化为CCD_ 2。
struct something* s = NULL;
s = malloc(sizeof(struct something));
在这里,我用NULL值定义并初始化它,然后将它的内存分配(更改)为动态内存。
它还有什么不同?如果我哪里错了,也请纠正我。
如果有的话,哪一种是不好的做法?
在这里,我动态地将内存分配给s,同时定义并将其初始化为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而不是您获得的地址。
如前所述,你的第二次机会会更好。一定要处理内存分配不成功的情况,因为如果分配失败,你会得到意想不到的行为。关于未初始化的指针-建议您在内存分配(以及分配成功检查)之后立即初始化数据。
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*/