malloc(0)中有什么意义?

jld*_*ont 115 c malloc

刚看到这段代码:

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)

  • 就个人而言,我认为设置为NULL是一种更好的跨平台策略,因为free()可以保证(按规范)在NULL上作为输入正常工作. (46认同)
  • 真的希望规范会说"安全地传递给realloc" - 以及 - (7认同)
  • 正如 C. Ross 所提到的,从技术上讲,某些平台可以在此处返回一个指针(即“可以传递给 free 的唯一指针”),但是如果您将其视为 char*,则可能会给您一个无效的非终止字符。在跨平台情况下依赖它可能很危险。 (3认同)
  • @hanshenrik 谁说你不能?[`realloc()`](http://pubs.opengroup.org/onlinepubs/009695399/functions/realloc.html) 允许你传递 `malloc()` 返回的任何有效指针。应该够了。 (3认同)

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.

  • 它依赖于实现这一事实使得它或多或少完全无用 - 这是C标准中较为尴尬的部分之一,并且相当多的标准委员会(例如PJ Plauger)对此抱怨不已. (9认同)
  • 我同意.如果`malloc(0)`返回一个有效的指针,那么`malloc()`返回'NULL`总是意味着"失败",而'0`不再是一个特殊的情况,这更加一致. (8认同)
  • 你可以`realloc`一个由`malloc(0)`返回的指针吗?你可以`realloc((char*)NULL)` (4认同)
  • @Braden对两者都是好的. (2认同)

Coi*_*oin 10

malloc(0)行为是特定于实现的.该库可以返回NULL或具有常规malloc行为,没有分配内存.无论它做什么,都必须在某处记录.

通常,它返回一个有效且唯一的指针,但不应该取消引用.另请注意,即使它实际上没有分配任何内容,它也会占用内存.

可以重新分配非null malloc(0)指针.

尽管如此,使用malloc(0)逐字逐句并不是很有用.它主要用于动态分配为零字节且您不关心它的情况.

  • `malloc()`必须在某处保留"管家信息"(例如,这个块大小分配,以及其他辅助数据).因此,如果`malloc(0)`不返回`NULL`,它将使用内存来存储该信息,如果不是'free()`d,将构成内存泄漏. (8认同)

cma*_*ter 6

这里有很多半真半假的答案,所以这里是铁的事实。手册页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。