请参阅代码:
struct something* s = malloc(sizeof(struct something));
s = NULL;
在这里,我在定义时动态地将内存分配给s
。然后将其初始化为NULL
。
struct something* s = NULL;
s = malloc(sizeof(struct something));
在这里,我使用NULL值定义并初始化它,然后将其内存分配分配(更改)到动态内存。
它还有什么不同之处?如果我错了,请纠正我。
哪一个是不好的做法,如果有的话?
答案 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*/