字符串“sizeof”的意外结果

时间:2011-03-28 18:24:01

标签: c++ c sizeof

为什么在以下情况下sizeof会打印不同的值:

printf("%d",sizeof("ab")); //print 3

char* t="ab";
printf("%d",sizeof(t)); //print 4

在第一种情况下,我有2个字符......不应该sizeof打印2?因为它们是2个字节?

5 个答案:

答案 0 :(得分:7)

  

C中的字符串以空值终止。

内存中的

“ab”看起来像'a' 'b' '\0'

虽然t是指针,但大小为4。

答案 1 :(得分:7)

t是指向包含"ab"的数组的指针。它的大小是指针的大小。

"ab"是一个包含"ab"的数组。它的大小是该数组的大小,这是三个字符,因为你必须考虑空终止符。

数组不是指针。

答案 2 :(得分:3)

因为在第一种情况下,您要求的是数组的大小。第二次你要求指针的大小。

答案 3 :(得分:3)

字符串文字是char数组,而不是char *。

char a[] = "ab";
char * t = a;
printf("%d",sizeof(a)); //print 3
printf("%d",sizeof(t)); //print 4

答案 4 :(得分:3)

字符串文字"ab"类型const char(&)[3]
所以sizeof("ab") = sizeof(const char(&)[3]) = sizeof(char) * 3在您的计算机上为3。

在另一种情况下,t只是一个指针 所以sizeof(t) = sizeof(void*)是你机器上的4个字节。

-

注意:

如果您将"ab"添加到L,并将其设为L"ab",那么,

字符串文字L"ab"类型const wchar_t(&)[3]
所以sizeof(L"ab") = sizeof(const wchar_t(&)[3]) = sizeof(wchar_t) * 3在ideone上是12:

http://ideone.com/IT7aR

这是因为在使用GCC编译的ideone上的sizeof(wchar_t) = 4