C/C++中sizeof对指针和数组结果的区别
大家都知道sizeof(data)是用于求data的所占内存大小的,那么sizeof求申请了20字节内存的指针和开辟了20单位的字符数组的结果分别是什么,以及sizeof求内存大小的原理是什么,是预先就知道大小信息还是计算而得呢?
先写一个程序测试一下:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
char a;
char *b;
int *c = new int[20];
char *d = "HelloWorld!";
char e[20] = "HelloWorld!";
printf("sizeof(a) = %d\n",sizeof(a));
printf("sizeof(b) = %d\n",sizeof(b));
printf("sizeof(*b) = %d\n",sizeof(*b));
printf("sizeof(c) = %d\n",sizeof(c));
printf("sizeof(*c) = %d\n",sizeof(*c));
printf("sizeof(d) = %d\n",sizeof(d));
printf("sizeof(*d) = %d\n",sizeof(*d));
printf("sizeof(e) = %d\n",sizeof(e));
return 0;
}
运行结果如图(c语言结果一样):
因为指针里存储的是地址,所以不管是什么类型的指针,在64位系统下所占内存都是4字节。
而开辟了连续内存空间的指针,因为是指向首地址,所以sizeof(*p)的结果为sizeof(指针类型)的大小。
上面两个结论都很简单,但是sizeof(e)的结果为20,那么系统是怎么知道数组大小的呢?难道是数组其实还存储着大小信息?
那么再来做个实验:
#include<iostream>
#include<cstdio>
using namespace std;
void test(char e[]){
printf("在其他函数中e的地址:%x\n",e);
printf("在其他函数中sizeof(e) = %d\n",sizeof(e));
}
int main(){
char a;
char *b;
int *c = new int[20];
char *d = "HelloWorld!";
char e[20] = "HelloWorld!";
printf("sizeof(a) = %d\n",sizeof(a));
printf("sizeof(b) = %d\n",sizeof(b));
printf("sizeof(*b) = %d\n",sizeof(*b));
printf("sizeof(c) = %d\n",sizeof(c));
printf("sizeof(*c) = %d\n",sizeof(*c));
printf("sizeof(d) = %d\n",sizeof(d));
printf("sizeof(*d) = %d\n",sizeof(*d));
printf("sizeof(e) = %d\n",sizeof(e));
printf("e的地址:%x\n",e);
test(e);
return 0;
}
这次加了个函数,把这个数组作为参数传递给这个函数,再sizeof(e),结果如图:
可以看到在其他函数中sizeof已经不知道数组e的实际大小了。再做最后一个实验:
#include<iostream>
#include<cstdio>
using namespace std;
double func(double x){
cout << "调用了func()函数" << endl;
return 3;
}
int main(){
cout << sizeof(func(10)) << endl;
cout << sizeof(double) << endl;
return 0;
}
结果如图:
可以看到,函数并没有被执行,sizeof直接根据函数原型的返回值类型得出结果。
所以得出结论,sizeof(data)是在编译之前直接根据定义数据时的样子求得大小,再把值替换在代码里。