計算結構體的大小


計算結構體的大小:
結構體中可以定義的數據類型:
1.基本類型
2.上面已經出現過的數據類型,比如說上面已經定義過的結構體
3.指向自己的指針
因為內存對齊的問題,各個數據類型放的位置不同就會導致結構體的大小不一樣,那么到底
怎樣計算一個結構體的大小呢?
先介紹一個概念——偏移量,結構體中的偏移量就是結構體成員和結構體變量的地址之差,
比如說第一個結構體成員的偏移量就是0,第二個結構成員的偏移量就是第一個結構體成員
的大小,假如第一個成員的是int b;那么第二個結構體成員變量的偏移量就是4,
計算結構體大小的規則:
1.每一個成員的偏移量都必須是該成員的倍數。
2.結構體的大小必須是該結構體字節數最大成員的倍數。
例如下面的結構體:例一:
    struct A
 {
  char a;
     short b;
     int c;
 };
第一個成員的偏移量都是0;一般可以不看,a的大小為1,所以成員b的偏移量為1,b的大小
為2,1不是2的倍數,所以應該將1+1,成為2的倍數,成員c的偏移量就為1+1+2,是成員c的
倍數,現在就符合計算結構體大小的第一條:改成員的偏移量是該成員大小
的倍數,還有第二條規則:結構體大小是結構體最大成員的倍數,結構體的大小就是各個成員
之和,a;2,b:2,c:4加起來就是8,該結構最大成員為c大小為4,滿足第二個條件,所以該結
構體的倍數就是8

代碼:

#include <stdio.h>
int main ()
{
    struct A
    {
        char a;
        short b;
        int c;
    };
    printf ("%d",sizeof(A));
    return 0;
}

 


例二:
struct Data
{
    char a;
 int b;
 int64_t c;    該數據類型是有符號的占64位的整形數據類型
 char d;
}

成員a的偏移量就不用看了,上面有說每一個結構體第一個成員的偏移量都為0;
但他的大小是1,也就是成員b的偏移量,成員b的大小是4,1不是4的倍數,所以a
的大小1應該加上3,就是4,成員3的偏移量是8,成員c的大小是8,成員c的偏移量是
成員c大小的倍數,就不用增加大小,成員d的偏移量是16,成員d的大小是1,偏移量
是成員大小的倍數,現在就符合計算結構體大小的第一條:改成員的偏移量是該成員大小
的倍數,還有第二條規則:結構體大小是結構體最大成員的倍數,最大成員為c,大小
是8,結構體的大小就是各個成員之和,a:4,b:4,c:8,d:1所有的加起來就是17,
但是17不是8的倍數,所以應該將17+7就是24,所以該結構體的大小就是24

代碼:

#include <stdio.h>
int main ()
{
    struct Data
{
    char a;
    int b;
    long long  c;    
    char d;
};
    printf ("%d\n",sizeof(Data));
    return 0;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM