最近看到了腾讯的一道笔试选择题,觉得很有意思,主要是涉及到数据对齐问题。
下面代码在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