今天使用动态数组,本来想通过sizeof 获取动态数据,结果出现了错误。
先对自己做个测试,能做出下面这个题目,并做出合理解释,可以不用往下看了。
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
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
示例来源于网络,参考解释如下:
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求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小