我不太熟悉 C 标准,所以请耐心等待。
我想知道按照标准是否可以保证memcpy(0,0,0)
是安全的。
我能找到的唯一限制是,如果内存区域重叠,则行为未定义......
但是我们可以认为这里的内存区域是重叠的吗?
我有 C 标准 (ISO/IEC 9899:1999) 的草案版本,其中有一些关于该调用的有趣内容。对于初学者来说,它提到了(§7.21.1/2)memcpy
that
当参数声明为size_t
n 指定数组的长度
函数,n 可以在调用该函数时具有零值。除非明确说明
否则在本子条款中特定功能的描述中,指针参数
在这样的调用上仍应具有有效值,如 7.1.4 中所述。在这样的通话中,
查找某个字符未出现的函数、比较两个字符的函数
字符序列返回零,复制字符的函数复制零
人物。
这里指出的参考指向这一点:
如果函数的参数具有无效值(例如
在函数域之外,或者在程序地址空间之外的指针,或空指针,或者当对应的时指向不可修改存储的指针
参数不是 const 限定的)或函数不期望的类型(提升后)
参数数量可变,行为未定义.
所以看起来根据 C 规范,调用
memcpy(0, 0, 0)
导致未定义的行为,因为空指针被视为“无效值”。
也就是说,如果任何实际实施,我会感到非常惊讶memcpy
如果你这样做,就会崩溃,因为如果你说复制零字节,我能想到的大多数直观实现都不会执行任何操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)