【发布时间】:2011-07-11 17:02:49
【问题描述】:
我对C标准不是很精通,所以请多多包涵。
我想知道根据标准是否可以保证memcpy(0,0,0) 是安全的。
我能找到的唯一限制是,如果内存区域重叠,则行为未定义...
但是我们可以认为内存区域在这里重叠吗?
【问题讨论】:
-
数学上两个空集的交集是空的。
-
我想检查一下你想要 (x)libC 为你做的事情,但正如 it's asm(此处为 elibc/glibc),这对于清晨来说有点太复杂了 :)
-
+1 我喜欢这个问题,既因为它是一个奇怪的边缘案例,又因为我认为
memcpy(0,0,0)是我见过的最奇怪的 C 代码之一。 -
@eq 您是否真的想知道,或者您是否暗示没有任何情况您想要它?您是否考虑过实际呼叫可能是
memcpy(outp, inp, len)?这可能发生在outp和inp动态分配且最初为0的代码中?例如,当p和len是0时,这适用于p = realloc(p, len+n)。我自己也使用过这样的memcpy调用——虽然它在技术上是 UB,但我从未遇到过它不是无操作的实现,也从未期望过。 -
@templatetypedef
memcpy(0, 0, 0)很可能是为了表示动态调用,而不是静态调用……也就是说,这些参数值不必是文字。
标签: c memcpy language-lawyer null-pointer