zoukankan      html  css  js  c++  java
  • 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
    ",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 

     
  • 相关阅读:
    GDB的启动方式
    【linux】基础1
    web安全实战折腾系列-对应B站视频
    白帽子讲web安全笔记-对应B站视频
    DNF搬砖号打造【只适合100级的版本】
    阿里云的开发者社区测试
    OWASP安全测试指南-OTGv4
    第8章 VLAN
    web安全简介与环境配置-反射型XSS-存储型XSS-XSS进阶-sql注入基础
    xss攻防
  • 原文地址:https://www.cnblogs.com/xiaodingmu/p/7420240.html
Copyright © 2011-2022 走看看