C/C++中sizeof对指针和数组结果的区别

3 篇文章 0 订阅

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语言结果一样):

sizeof结果
因为指针里存储的是地址,所以不管是什么类型的指针,在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),结果如图:

sizeof2结果
可以看到在其他函数中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)是在编译之前直接根据定义数据时的样子求得大小,再把值替换在代码里。

参考博客

https://blog.csdn.net/yyg15/article/details/88375071

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值