c/c++结构体中数据对齐

最近看到了腾讯的一道笔试选择题,觉得很有意思,主要是涉及到数据对齐问题。

下面代码在64位计算机上运行结果是多少?

 1 #include <stdio.h>
 2 #include <string.h>
 3 struct st_t {
 4     int status;
 5     short *pdata; //64位系统下指针占8个字节。 
 6     char errstr[32]; //需要考虑数据对齐 
 7 };
 8 
 9 int main(){
10     st_t st[16],a;
11     char *p=(char *)(st[2].errstr+32);
12     //printf("%d\r\n",sizeof(a));
13     printf("%d",(p-(char *)(st)));
14     return  0;
15 }

  最后运行结果是144,通过第十二行出注释的打印语句我们可以知道结构体st_t的大小为48,和我们所想的不太一样,后来发现是数据对齐问题,在64位计算机上,地址是占8个字节,所以指针大小为8,这里要注意和编译器有一定的关系,在64位系统上,有的编译器编译环境还是32位,如vs2005,2010默认就是32位编译环境,即使在64系统上,此时得到的指针大小会是4。这里我们按照常规分析,题中已经说明运行在64位系统上,指针大小就是8位,这里我们就看结构体中数据,整型数据status大小为4个字节,指针pdata大小8个字节,char型数组errstr大小为32个字节,结构体中数据在进行存储的时候,在默认情况下为了便于对结构体内的元素进行访问和管理,当结构体内的元素都小于处理器的位数的时候,便会以结构体中最长的数据元素为对其单位,也就是说结构体的长度一定是最长的数据元素的整数倍。所以这里将以指针的大小为对其方式,所以整个结构体大小为8+8+32=48。

数组st[16]中每个元素都是结构体类型,所以数组大小为16x48=768,指针p指向的内容涉及到二级指针,指向如下图所示:

从图中我们可以非常清楚的看到指针p所指向的对象,而st是数组名指向的是机构体中的第一个元素,所以我们就可以计算出(p-(char *)(st)大小,也就是他们之间所隔元素占用的内存大小,即是48*2+8+8+32=144
这里我想到了一个容易混淆的概念,即数组加1的区别。
eg:int a[3],区分a+1,&a+1;a+1=a[1];&a+1=a[4],也就是偏移整个数组单位。

 本文为作者原创,转载请注明出处,谢谢!http://www.cnblogs.com/xiaodingmu/p/7420240.html 

 

 

转载于:https://www.cnblogs.com/xiaodingmu/p/7420240.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值