計算結構體的大小

計算結構體的大小:
結構體中能夠定義的數據類型:
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,知足第二個條件,因此該結
構體的倍數就是8spa

代碼:3d

#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,因此該結構體的大小就是24code

代碼:blog

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

 

相關文章
相關標籤/搜索