sizeof总结

好记性不如烂笔头,写下来方便自己查阅复习。环境:win7+vs2010.

这里贴出两个运行结果,分别对应32bit和64bit下的结果,需要说明的几点(分别对应图中的第一二三四五部分):

1、32位,指针占4字节;64位,指针占8字节。其他的基本数据类型大小一样。

2、sizeof和strlen的区别,strlen计算字符数组中字符数,遇到(计算的时候不包含)"\0"结束,而sizeof计算数据所占的内存空间,以字节为单位。

      像上面的char a1[] = "abcde";这里strlen(a1)就是5,sizeof(a1)就是6,因为字符数组的结束处还有个'\0',在内存中为它分配6个字节。

3、把字符数组作为参数传递到函数后(如上图第三部分所示),这里a已蜕变成指针。所以可以看到,在32位下它的size为4,在64位下它的size为8。

4、关于结构体的size,注意结构体存在对齐问题和位域问题。

      对齐:结构体会选取最大的元素类型来对齐,如:struct Stru1{char c; int i;}这个结构体里有两种数据类型,其中char类型占1字节,int占4字节,根据对齐的原则,char需要补充3个字节来与int对齐,因此从上图中也可看到sizeof(Stru1)为4+4=8。注意:上图中的结构体s1中的对齐大小为1,这就是为什么sizeof(s3)的结果是9。

      位域:如图中第四部分所示,结构体中的int a:3表示a为int型,但是只占3位,也就是a的最大值是7,所以结构体s5中最大的元素类型就是int占4个字节,而前两个加起来还没有补全4字节,需要继续补全至4字节,因此最终的sizeof(s5)为8。

5、一个据说很经典的sizeof的题目,但是我感觉我应该没多少机会去声明出这样的变量...

      double*(*a)[3][6]这个是这么理解的,括号里面的*a表示这是一个二维数组,二维数组里存的是double*。也就是a是一个指针,指向一个二维数组,这个二维数组存着指针(double*)。

      所以sizeof(a)在32位下就是4,64位下就是8;

      sizeof(*a)就是二维数组的size,32位下为3*6*4=72,64位下为3*6*8=144;

      sizeof(**a)就是二维数组中“第一行”的大小,**a表示double*[6],这包含了6个指针,32位下为6*4=24,64位下为6*8=48;

      sizeof(***a):***a指向**a的第一个元素("第一行"里的第一个),类型是一个指针(double*),所以32位下为4,64位下为8;

      sizeof(****a):***a已经指向了第一个元素(为double*),那么****a就是***a指向的那个元素,也就是那个double值,存储的是个double的类型,因此32位下为8,64位下为8。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值