提问人:tbhaxor 提问时间:11/6/2023 更新时间:11/6/2023 访问量:119
malloc 中的分配大小为零是否会导致内存位置冲突?
Could allocation size of zero in malloc result in conflicting memory locations?
问:
所以从 malloc(0)
问题的解释来看。我发现在返回非 NULL 值时分配的内存块大小为零的概念是违反直觉的。(从这里结束)
由于两个 malloc 地址不能相同,因此返回的分配应至少占用一个字节,以保证将来调用的返回值不会与当前进程生存期内的任何返回值发生冲突。malloc
malloc(0)
或者,这意味着在这种情况下,两个 malloc(一个为 0,另一个没有)将返回相同的基址,这是冲突的,因为不可能有两个不同大小的内存位置。
答:
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)
*1没有第一个的干预。free()
评论
malloc(0)
malloc(0)
malloc(0)
malloc(0)
free()
malloc( 0 )
NULL
NULL
malloc(0)
NULL
上一个:声明大型数组时出现堆栈溢出异常
下一个:C malloc 有效,但不应该
评论
malloc
NULL
malloc(0)
NULL
NULL