关于结构体开辟空间大小判断

104 阅读2分钟

结构体空间申请

  • 空间申请总是按照之前出现的基准中最大的向后申请 如:前面出现了double 后面在需要空间时都是一次性申请8个字节。遵循规则的基础类型:char、short、int、double、指针(8字节)
  • 不管申请空间有多大,变量总是按照自己对齐规则占用申请的空间 如:
    //a占用一个字符,但是b占用8个字符,
    // 因此在a b之间有7个空位 c 后面有3个空格 d占用剩下的4个空格
    a 0 0 0  0 0 0 0
    b b b b  b b b b       
    c 0 d d  0 0 0 0
    struct Node{
    //此处占用第一的位置
        char a; 
        //满足自己的对齐原则,前面也要是8位数,因此跳过七位
        double b;
        //此处已经申请到了以8未基准的空间(double) 且自己占用申请空间的第一位
        char c;
        //此处 使用在c已经申请好的8位的空间,但需要遵循自己的对齐规则,则跳过一位 自己占用两位,
        short  d;
        //后面还有4位的空的申请空间没用
    }
    

复杂案例解析

typedef struct Node{
    //
    char a;
    short b;
    char c;
    char d;
    int e;
    double f;
    char g;
    int k;

}Node;

image.png

解析
  • char 一个字节
  • short 两个字节
  • int 4个字节
  • double 8个字节
  • a占用一个字节 1
  • b占用两个字节,由于a处之开辟了一个空间,无法满足b 2的空间因此对于b需要跳过一个空格,使对齐
  • c处由于b是两个字节在开辟c时候就以b两个字节开辟空间,因此c,d刚好占满由于b的大小开辟的空间
  • e由于c,d是由b 2字节开辟的空间 不满足自己4个字节 ,因此对于e,cd后面空两个字节刚好占满四个字节
  • f同理e只占用了4字节 不满足自己8字节要求 跳过4个字节,与自己对齐,
  • g开辟是像更大的f对齐,因此当只有g时就已经申请了8个字节的空间 不论是否有k 当前结构体大小都是1+1+2+1+1+2+4+4+8+8=32
  • k由于已经申请了8个字且也满足自己的4字节对齐要求,因此跳3个字节对齐自己自己排在最后。1+1+2+1+1+2+4+4+8+3+4=32

image.png