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