For the malloc
function,第 6.5 §6 段明确指出不可能编写一致且可移植的 C 实现:
The effective type of an object for an access to its stored value is the declared type of the
object, if any(87)...
(非规范性)注释 87 说:
分配的对象没有声明类型。
声明没有声明类型的对象的唯一方法是...通过返回此类对象所需的分配函数!所以在分配函数中,你必须有某物标准不允许设置没有声明类型的内存区域。
在常见的实现中,标准库malloc和free确实是用C实现的,但是系统知道它并假设内部已经提供了字符数组malloc
只是没有声明类型。句号。
但同一段的其余部分解释说,编写一个没有真正的问题memcpy
实施(强调我的):
...如果通过一个值存储到一个没有声明类型的对象中
左值的类型不是字符类型,则左值的类型变为
该访问和不修改的后续访问的对象的有效类型
存储的值。如果使用以下方式将值复制到没有声明类型的对象中
memcpy 或 memmove,或者被复制为字符类型的数组,则有效类型
该访问以及不修改对象的后续访问的已修改对象的
value 是从中复制值的对象的有效类型(如果有)。为了
对没有声明类型的对象的所有其他访问,该对象的有效类型是
只是用于访问的左值的类型。
如果您将对象复制为字符类型数组(这是严格别名规则允许的特殊访问),那么实现就没有问题memcpy
,并且您的代码是可能且有效的实现。
恕我直言,霍华德朱的咆哮是关于那个古老的好东西memcpy
用法,不再有效(假设sizeof(float) == sizeof(int)
):
float f = 1.0;
int i;
memcpy(&i, &f, sizeof(int)); // valid: copy at byte level, but the value of i is undefined
print("Repr of %f is %x\n", i, i); // UB: i cannot be accessed as a float