計算結構體的大小:
結構體中能夠定義的數據類型:
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; }