为什么在以下情况下sizeof会打印不同的值:
printf("%d",sizeof("ab")); //print 3
char* t="ab";
printf("%d",sizeof(t)); //print 4
在第一种情况下,我有2个字符......不应该sizeof
打印2?因为它们是2个字节?
答案 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:
这是因为在使用GCC编译的ideone上的sizeof(wchar_t) = 4
!