malloc 中的分配大小为零会导致内存位置冲突吗?

Gur*_*ngh 1 c malloc libc

所以从问题的解释来看malloc(0)。我发现返回非空值时分配的内存块大小为零的概念是违反直觉的。(从这里结束)

\n

由于两个 malloc 地址不能相同,因此返回的分配应该至少占用一个字节,以保证未来调用的返回值不会mallocmalloc(0)当前进程生命周期中的任何地址发生冲突。

\n

或者,这意味着两个 malloc\xe2\x80\x94(其中一个为 0,另一个没有 \xe2\x80\x94)将在这种情况下返回相同的基地址,这是冲突的,因为两个不同大小的内存位置是不可能的。

\n

chu*_*ica 8

\n

malloc 中的分配大小为零会导致内存位置冲突吗?

\n
\n

不。

\n

考虑非零大小的调用。
\n2 次成功调用malloc(some_non-zero_value)*1返回不同的指针。

\n

现在看起来尺寸为零。分配大小为零是特殊的,值得仔细消化 C 规范。

\n

当分配大小为零时,会发生以下两种情况之一:

\n
    \n
  • “如果请求的空间大小为零,则行为是由实现定义的:要么返回空指针以指示错误,要么行为就好像大小是某个非零值,但返回的指针不应用于访问对象。”
    \nC23dr \xc2\xa7 7.24.3 1
  • \n
\n

因此,如果代码在分配大小为零时没有接收到空指针,则该指针就像是一样malloc(some_non-zero_value)。多次成功malloc(some_non-zero_value)是独一无二的。

\n
\n

由于您的代码可能会容忍来自的空指针malloc(0),并且多个调用可能都返回空指针,因此会丢失返回不同指针的不同调用的唯一性属性,因此始终使用非零大小来保持唯一性。

\n
\n

更深

\n

“...返回的分配应该至少占用一个字节,以保证未来对 malloc 的返回值调用不会与当前进程生命周期中的任何 malloc(0) 发生冲突。” --> C 规范不支持“应该占用至少一个字节”。

\n

考虑malloc()可以返回一个在访问之前实际上并不指向真实物理内存的指针。由于禁止调用者malloc(0)取消引用返回的指针,因此肯定不会使用物理内存。

\n

请参阅为什么 malloc 没有“用完”我计算机上的内存?

\n
\n

*1没有free()第一个干预。

\n