首先明确,sizeof不是一个函数,它是一个运算符!
1 | char str[] = "Hello"; |
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) 表示的也是这个数组第一个元素的大小。这显然是错误的!!

