c中的sizeof运算符

时间:2011-06-28 05:10:42

标签: c

我对此代码有疑问:

int main()
{
    printf("%d",sizeof(""));
}

打印1,为什么?

7 个答案:

答案 0 :(得分:7)

包含\0(空)字符的字符串,其大小为1 Byte

答案 1 :(得分:4)

"" = \0(空字符)。这是1个字节。因此它的大小是1。

答案 2 :(得分:4)

我将作者的问题解释为为什么打印1而不是4或8(指针大小),而不是为什么字符串的大小==数字连续的非零字节加1。

main(){printf("%d", sizeof((const char *)""));}

上述程序的输出为8(我机器上的指针大小)。在这种情况下,编译器将处理“”,因为它将在以下情况下处理:{const char * pointer =“”; },不像这个{char c [] =“”; }。 (如果您熟悉x86 asm,它基本上是lea与mov)后者为堆栈上的“缓冲区”保留1个字节,初始化为'\ 0'。

答案 3 :(得分:2)

字符串文字""的类型为char[1](一个元素的char数组,NUL字节),而不是char* / const char*。因此sizeof产生数组的大小,即1个字节。

答案 4 :(得分:0)

“”==空字符串或空终止指向字符的指针。

由于空终止符而打印1。

“”真的等于'\ 0'

答案 5 :(得分:0)

在C中,sizeof运算符以多个字节返回数据类型的大小。在您的情况下,空的“”花费您1个字节,因此它返回值1。

答案 6 :(得分:0)

您的程序实际上有未定义的行为,因为%d不是size_t表达式的有效格式说明符。您应该使用%zu或将sizeof的结果转换为int。否则现有答案都可以。