首先明确,sizeof不是一个函数,它是一个运算符!

1
2
3
4
5
6
7
8
9
10
11
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 位机上,分析一下输出结果。

  1. 字符数组的大小包括 ‘\0’,“Hello” 有 5 个字符,加上 ‘\0’,sizeof(str) 大小为6。

  2. 64 位机,因为寻址的原因,需要8个字节来存储指针的大小,因此 sizeof(pstr) 的大小为8。

  3. 最困惑的要属 sizeof(str_list) 了。一开始认为,字符数组指针也是指针,所以输出应该是 8,但程序输出的结果却是 16。经查证,[] 的优先级比 * 要高,因此 str_list 先和 [] 结合,它还是一个数组,数组中的元素是 char *。这个数组有两个元素,一个是指向常量 “Hello” 的指针,一个是指向常量 “world” 的指针,每个指针的大小都是 8,因此输出是 16。

  4. void* 本质也是一个指针,因此 sizeof(pbuf) 的大小也为8。

  5. int 类型在 64 位机上占 4 字节的存储空间,因此 sizeof(n) 的大小为4。

这里我一直有一个错误的认识。比如,int n[] = {1, 2, 3, 4}; 而我们知道,对于像这样的数组来说,&n[0]&n 表示的都是这个数组的第一个元素的地址,我之前一直想当然的认为 sizeof(n) 表示的也是这个数组第一个元素的大小。这显然是错误的!!