字符串“sizeof”的意外结果

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

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

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

C中的字符串为空终止。

记忆中的“ab”看起来像'a' 'b' '\0'

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

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

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

数组不是指针。

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

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

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

字符串文字"ab"类型const char(&)[3]
所以sizeof("ab") = sizeof(const char(&)[3]) = sizeof(char) * 3 3在你的机器上是3。

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

注意:

如果你用“ L "ab"前缀"ab" ,并使其为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