刚看到这段代码:
artist = (char *) malloc(0);
Run Code Online (Sandbox Code Playgroud)
我想知道为什么会这样做?
Ree*_*sey 118
根据规范,malloc(0)将返回"空指针或可以成功传递给free()的唯一指针".
这基本上可以让你什么都不分配,但仍然可以将"artist"变量传递给free(),而不用担心.出于实际目的,它几乎与做:
artist = NULL;
Run Code Online (Sandbox Code Playgroud)
Alo*_*hal 49
C标准(C17 7.22.3/1)说:
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,除了返回的指针不应用于访问对象.
因此,malloc(0)可以返回NULL或可能无法解除引用的有效指针.在任何一种情况下,调用free()它都是完全有效的.
我不认为malloc(0)有多大用处,除非在malloc(n)例如循环中调用,并且n可能为零.
看一下链接中的代码,我认为作者有两个误解:
malloc(0)总是返回一个有效的指针,和free(0) 不好.因此,他确保artist其他变量总是在其中具有一些"有效"值.评论说:// these must always point at malloc'd data.
Coi*_*oin 10
malloc(0)行为是特定于实现的.该库可以返回NULL或具有常规malloc行为,没有分配内存.无论它做什么,都必须在某处记录.
通常,它返回一个有效且唯一的指针,但不应该取消引用.另请注意,即使它实际上没有分配任何内容,它也会占用内存.
可以重新分配非null malloc(0)指针.
尽管如此,使用malloc(0)逐字逐句并不是很有用.它主要用于动态分配为零字节且您不关心它的情况.
这里有很多半真半假的答案,所以这里是铁的事实。手册页malloc()说:
如果 size 为 0,则 malloc() 返回 NULL,或稍后可以成功传递给 free() 的唯一指针值。
这意味着,绝对不能保证 的结果malloc(0)是唯一的或不为 NULL。唯一的保证是由 的定义提供的free(),这也是手册页的内容:
如果 ptr 为 NULL,则不执行任何操作。
因此,无论malloc(0)返回什么,都可以安全地传递给free(). 但指针也可以NULL。
因此,写作 artist = malloc(0); 并不比写作更好。 artist = NULL;
小智 5
在此页上的其他地方,有一个答案开始于“ malloc(0)将返回有效的内存地址,其范围将取决于正在分配的内存的指针的类型”。这句话是不正确的(我没有足够的声誉来直接评论该答案,因此不能直接在此下方发表评论)。
进行malloc(0)不会自动分配正确大小的内存。malloc函数不知道将结果强制转换为什么。malloc函数完全依赖于您为其参数指定的大小号。您需要执行malloc(sizeof(int))以获得足够的存储空间来容纳一个int,例如,不为0。