C语言里的sizeof关键字用于返回变量的类型宽度(变量所占的字节个数)。例如:
#include <stdio.h>
int main() {
int i = 0;
int size = sizeof i;
printf("size of i is: %d",size);
return 0;
}
会在控制台打印出int类型的变量i在内存中所占的字节的个数。我机器上的执行结果是:
size of i is: 4
从上面这个例子看,sizeof蛮好用的,同时你可能觉得以后你需要知道类型宽度的时候,你也不会用错。但是你想得太简单了,sizeof是有坑的,你很可能栽进去也不知道,程序有问题找不出来。
下面看看sizeof到底有什么坑爹的地方。
先举个例子,看看下面的程序的执行结果是什么?
#include <stdio.h>
int get_sizeof(char a[]) {
return sizeof a;
}
int main() {
int size = -1;
char a[] = "123456789"
size = sizeof a;
printf("size of a is: %d\n",size);
size = get_sizeof(a);
printf("size of a is: %d\n",size);
return 0;
}
估计出乎你的意料,执行结果竟然是:
size of a is: 10
size of a is: 4
为什么同样是使用sizeof运算符,只不过一个直接使用,另一个通过函数包装了一下,为什么结果就不一样了呢?
别怀疑编译器,编译器没错,这最多算是比较坑爹,原因很简单,在调用get_sizeof函数的时候,函数内部把参数a作为一个指针对待,而指针在内存中占4个字节的长度。对于函数内部声明的字符数组变量,它才会把它作为一个字符数组对待。
所以返回的是4。这里建议你不要抬杠,C语言就是这样的,它的规矩就是这么定的,说什么也没有用。除非哪一天你下定决心不再用C语言,这个折磨人的事情你就不用再承受。
总结起来是这样的,你死死记住就行了,别太深究:
当对一个字符数组变量做sizeof运算的时候,分为以下两种情况:
1、当这个变量是作为参数传入函数内部的话,C语言会认为这只是一个指针变量,做sizeof运算返回的将是一个指针在内存中所占的字节数。
2、其他情况,这时C语言会把该变量当成一个字符数组,做sizeof运算返回的将是字符数组的长度(包括\0在内)。