\n\nmalloc 中的分配大小为零会导致内存位置冲突吗?
\n
不。
\n考虑非零大小的调用。
\n2 次成功调用malloc(some_non-zero_value)*1返回不同的指针。
现在看起来尺寸为零。分配大小为零是特殊的,值得仔细消化 C 规范。
\n当分配大小为零时,会发生以下两种情况之一:
\n因此,如果代码在分配大小为零时没有接收到空指针,则该指针就像是一样malloc(some_non-zero_value)。多次成功malloc(some_non-zero_value)是独一无二的。
由于您的代码可能会容忍来自的空指针malloc(0),并且多个调用可能都返回空指针,因此会丢失返回不同指针的不同调用的唯一性属性,因此始终使用非零大小来保持唯一性。
更深
\n“...返回的分配应该至少占用一个字节,以保证未来对 malloc 的返回值调用不会与当前进程生命周期中的任何 malloc(0) 发生冲突。” --> C 规范不支持“应该占用至少一个字节”。
\n考虑malloc()可以返回一个在访问之前实际上并不指向真实物理内存的指针。由于禁止调用者malloc(0)取消引用返回的指针,因此肯定不会使用物理内存。
*1没有free()第一个干预。