cde*_*dev 15 c sizeof undefined-behavior
以下C程序:
#include <stdio.h>
int main(void)
{
printf("%u %u %u\n",sizeof "",sizeof(""+0),sizeof(char *));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Linux上使用GCC编译时输出1 4 4,但在Windows上使用Microsoft Visual C++编译时输出1 1 4.海湾合作委员会的结果是我所期待的.它们是否有区别,因为MSVC有错误或者因为sizeof(""+ 0)未定义?对于两个编译器,无论使用什么字符串文字或整数常量,行为(即打印的中间值是否等于第一个值或最后一个值)都是相同的.
ANSI C标准中的相关参考似乎是6.2.2.1 - 左值和函数指示符:
"除非它是sizeof运算符的操作数...具有类型'数组类型'的左值被转换为具有类型'指向类型的指针'的表达式,该表达式指向数组对象的初始元素,而不是一个左值".
这里虽然"Except"不适用,因为在sizeof(""+ 0)中,数组/字符串文字是+而不是sizeof的操作数.
因为"fooabc"
是类型char[7]
,sizeof("fooabc")
产量相同sizeof(char[7])
.但是,数组可以隐式转换 - 你引用的部分 - 指针(有些人错误地称之为"衰变"),并且因为这是算术(+
)工作所必需的,所以""+0
会有一个类型char*
.并且char指针可以具有与数组不同的大小.在这方面,MSVC的行为似乎被打破了.