字符串“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:
这是因为在使用GCC编译的ideone上sizeof(wchar_t) = 4
!