我正在尝试说服同事(引用C99标准的具体部分),以下内容是未定义行为:
int *p = malloc(1);
p[0] = 0;
但我无法在标准中找到明确确保这是未定义的部分。我特别寻找标准中从这些行到结论 "未定义行为" 的逻辑步骤。第一行是从 void *
转换成 int *
吗?第二行是赋值吗?关于
malloc
的唯一相关部分是它返回一个适当对齐的指针 (7.20.3):"如果分配成功,返回的指针将适当地对齐,以便可以将其分配给任何类型的对象的指针,然后用于访问所分配空间中的该对象或该对象数组"
我尝试在规范中搜索空间,但由于空格和其他词汇问题,有太多的噪音。
int
(4 字节?)。这足以使其成为未定义行为。 - Manos Nikolaidisp
是一个指针,那么p[0]
就相当于*p
。你不可能断言指针总是与其所指向的对象相同吧?另外,我没有说过你需要强制转换void *
,因为你不需要。只是因为“在C中指针可以安全自动正确地使用”并不意味着指针是安全的,因为在C中指针是不安全的。C不是一种托管语言 - “安全指针”与这种隐式类型转换毫无关系。 - The Paramagnetic Croissantp
是一个地址。p[0]
是该地址处的数据。这两个东西可能非常不同,特别是因为int
和地址甚至不一定具有相同的大小。 - 8bittree