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

Could allocation size of zero in malloc result in conflicting memory locations?

提问人:tbhaxor 提问时间:11/6/2023 更新时间:11/6/2023 访问量:119

问:

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

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

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

c 马洛克 libc

评论

4赞 Chris 11/6/2023
对于具有特定于实现的行为的东西,如果你想知道为什么某物会这样做,你必须询问实现者。
1赞 user207421 11/6/2023
您忽略了唯一性要求。它确实占用了至少一个字节,因为它有自己的开销。它必须在某个地方保留一个长度的单词,也许更多。您的链接中没有任何建议。
2赞 Tom Karzes 11/6/2023
Posix 的手册页说,对于零大小,它将返回或返回一个唯一的指针。我的建议是避免使用零大小。如果需要唯一的指针,请使用大小 1。mallocNULL
1赞 SoronelHaetir 11/6/2023
要记住的是,传递给 malloc 的值是最小的值,实现可以自由地分配超过请求的数量(实际上通常必须用于簿记目的,即使该内存不可供 malloc 的调用方使用)。
3赞 nielsen 11/6/2023
@tbhaxor不必分配任何内存。是的,它必须返回一个唯一的指针(或),但这完全取决于实现者如何实现。您暗示分配少量内存是唯一的方法。这是不正确的。即使返回的指针不是 ,它也不必指向可用地址。malloc(0)NULLNULL

答:

8赞 chux - Reinstate Monica 11/6/2023 #1

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

不。

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

现在看作零号。分配大小 0 是特殊的,值得仔细消化 C 规范。

如果分配大小为零,则会发生以下 2 种情况中的 1 种:

  • “如果请求的空间大小为零,则行为为 实现定义:要么返回 null 指针以指示错误,要么行为就好像大小是某个非零值一样,只是返回的指针不应用于访问对象。
    C23dr § 7.24.3 1

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


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


更深

"...然后,返回的分配应至少占用一个字节,以保证返回值将来对 malloc 的调用不会在当前进程的生命周期内与任何 malloc(0) 发生冲突>。

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

请参阅为什么 malloc 没有“耗尽”计算机上的内存?


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

评论

0赞 Schwern 11/6/2023
允许返回非 null 的理由是什么?malloc(0)
0赞 chux - Reinstate Monica 11/6/2023
@Schwern我可以看到一个实现希望在旧实现中失败和成功时提供独特的指针,并保持这种状态。在这个问题上,C17 的规范发生了变化。IMO 更改仍然会导致一些不确定因素,建议不要调用,因为它是规范历史和实现定义行为的兔子洞malloc(0)malloc(0)malloc(0)
0赞 nielsen 11/6/2023
@Schwern我在这里猜测,但理由可能只是没有理由不允许返回非 null。另一方面,要求唯一的非空指针是有充分理由的,否则可能会在后续调用 时出现问题。free()
0赞 Andrew Henle 11/6/2023
@Schwern 摘自《美国国家信息系统标准-编程语言-C》(原文斜体)的基本原理:“X3J11章程明确授权委员会编纂现有通用做法。..."在 C 被标准化之前,可能有不同的实现,有些会返回,有些会返回无法安全取消引用的非指针。malloc( 0 )NULLNULL
0赞 tstanisl 11/6/2023
它看起来像是标准中的缺陷。在实践中,此定义可防止返回非 null 值,因为它强制指针在每次调用时是唯一的。在这种情况下,不合规的实现可以简单地返回一个 cookie(即指向静态对象的指针)。每次生成一个唯一的指针太麻烦了,因此任何实际的实现都只会返回到更简单的实现。malloc(0)NULL