sizeof(“”+ 0)!= sizeof(char *)错误或未定义的行为?

时间:2011-02-01 12:23:49

标签: c sizeof undefined-behavior

以下C程序:

#include <stdio.h>

int main(void)
{
    printf("%u %u %u\n",sizeof "",sizeof(""+0),sizeof(char *));
    return 0;
}

在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的操作数。

3 个答案:

答案 0 :(得分:7)

由于"fooabc"的类型为char[7]sizeof("fooabc")的格式与sizeof(char[7])相同。但是,数组可以隐式转换 - 你引用的部分 - 指针(有些人错误地称之为“衰变”),并且由于这是算术(+)工作所必需的,""+0将类型为char*。并且char指针可以具有与数组不同的大小。在这方面,MSVC的行为似乎已经破裂。

答案 1 :(得分:1)

我猜这是MSVC的错误。

""+0获取""的地址(在char*类型中衰减)并将0加到其中。该表达式类型为char*

玩一点:""+0的价值是多少?和""+1?和sizeof(""+1)

答案 2 :(得分:1)

看起来像是MSVC中的一个错误。显然,优化程序会在进行正确的类型分析之前删除+0