char str[] = "Hello";
char* pstr = str;
const char* str_list[] = { "Hello","world"};
void* pbuf = malloc(100);
int n = 10;
sizeof(str)
sizeof(pstr)
sizeof(str_list)
sizeof(pbuf)
sizeof(n)
64 位机上,分析一下输出结果。
-
字符数组的大小包括 ‘\0’,“Hello” 有 5 个字符,加上 ‘\0’,
sizeof(str)
大小为6。 -
64 位机,因为寻址的原因,需要8个字节来存储指针的大小,因此
sizeof(pstr)
的大小为8。 -
最困惑的要属
sizeof(str_list)
了。一开始认为,字符数组指针也是指针,所以输出应该是 8,但程序输出的结果却是 16。经查证,[]
的优先级比*
要高,因此str_list
先和[]
结合,它还是一个数组,数组中的元素是char *
。这个数组有两个元素,一个是指向常量 “Hello” 的指针,一个是指向常量 “world” 的指针,每个指针的大小都是 8,因此输出是 16。 -
void*
本质也是一个指针,因此sizeof(pbuf)
的大小也为8。 -
int
类型在 64 位机上占 4 字节的存储空间,因此sizeof(n)
的大小为4。
这里我一直有一个错误的认识。比如,int n[] = {1, 2, 3, 4};
而我们知道,对于像这样的数组来说,&n[0]
和 &n
表示的都是这个数组的第一个元素的地址,我之前一直想当然的认为 sizeof(n)
表示的也是这个数组第一个元素的大小。这显然是错误的!!
以后遇到关于 sizeof 的问题将统一放到这篇博客上来。