我对此代码有疑问:
int main()
{
printf("%d",sizeof(""));
}
打印1
,为什么?
答案 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
。否则现有答案都可以。