C\C++ sizeof 陷阱&&总结

本文详细介绍了C/C++中的sizeof运算符,包括其不能求void类型长度、能求void指针长度、能求静态数组长度、不能求动态分配内存大小等特性。还探讨了sizeof在函数参数、表达式求值、函数调用以及结构体成员对齐等方面的应用,强调了sizeof在处理位域成员时的限制。通过对sizeof的深入理解,有助于避免编程中的常见错误。
摘要由CSDN通过智能技术生成

今天使用动态数组,本来想通过sizeof 获取动态数据,结果出现了错误。

先对自己做个测试,能做出下面这个题目,并做出合理解释,可以不用往下看了。

double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4
cout<<sizeof(*a)<<endl; // 72
cout<<sizeof(**a)<<endl; // 24
cout<<sizeof(***a)<<endl; // 4
cout<<sizeof(****a)<<endl; // 8
View Code

 

示例来源于网络,参考解释如下:

a是一个很奇怪的定义,他表示一个指向 double*[3][6]类型数组的指针。既然是指针,所以sizeof(a)就是4。

(指针占用内存的大小,这里的说法并不严谨。指针大小是由当前CPU运行模式的寻址位数决定。参考http://www.cnblogs.com/qingxinlangjing/p/3208395.html


既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*sizeof(double*)=72。同样的,**a表示一个double*[6]类型的数组,所以sizeof(**a)=6*sizeof(double*)=24。***a就表示其中的一个元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一个double了,所以sizeof(****a)=sizeof(double)=8。 

 

 

特对sizeof进行总结如下:

一、sizeof介绍:

sizeof用来求对象或者类型的大小。下面列出sizeof十个特性:摘自(http://www.cppblog.com/w57w57w57/archive/2011/08/09/152845.html

(0)sizeof是运算符,不是函数;

(1)sizeof不能求得void类型的长度;

(2)sizeof能求得void类型的指针的长度;

(3)sizeof能求得静态分配内存的数组的长度!

(4)sizeof不能求得动态分配的内存的大小!

(5)sizeof不能对不完整的数组求长度;

(6)当表达式作为sizeof的操作数时,它返回表达式的计算结果的类型大小,但是它不对表达式求值!

(7)sizeof可以对函数调用求大小,并且求得的大小等于返回类型的大小,但是不执行函数体!

(8)sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值