struct與union內存分配問題

今天在調試代碼時,關於struct與union內存分配問題產生了疑惑,故上網查詢了相關資料,記於此,以便日後查看。

struct與union在內存分配的時候,主要區別如下:

前者按照結構體內定義的數據順序來進行分配內存的,分配的基本單位(即:每分配一次的量)是struct裏面所定義的最長數據類型的長度;後者聯合體內的數據共用一塊內存,是以union裏面所定義的最大類型長度的整數倍來分配內存的。

定義之類的東東總是讓人感到枯燥乏味,舉個形象的例子,有一個struct類型變量定義如下:

struct {
	int a;
	char b;
	double c;
}demo;

那麼系統分配給demo結構體的內存空間是多大呢?

答案是16!爲什麼呢?因爲系統先分配8個字節用來放int,結果int只需要4個就夠了,然後剩下的4箇中的一個可以用來放後面的char,碰到double c時,因爲此時的3個字節不能存下,所以再分配了一個8個字節來存放double c。

試想一下,如果這個struct類型變量其內存定義的變量順序改變成如下所示:

struct {
	int a;
	double b;
	char c;
}demo;

那個系統分給這個struct的內存空間又是多少呢?

應該是24!知道爲什麼的吧?系統碰到int分給他8個字節存放,碰到double時,剩下的4個字節不足以存放,所以再分配了8個字節,再遇到char c時又分配了8個字節,這樣系統其實是浪費了5個字節的空間。所以在結構體裏面最好按照類型從小到大的順序來


一個簡單的測試例子:

#include <stdio.h>

struct S1 {
	char c;
	double b;
};

struct S2 {
	char c1;
	double b;
	char c2;
};

struct S3 {
	char c1;
	char c2;
	double b;
};

union U1 {
	char c;
	double b;
};

union U2 {
	char c1;
	double b;
	char c2;
};

union U3 {
	char c1;
	char c2;
	double b;
};

union U4 {
	int a[5];
	double b;
};

int main()
{
	printf("sizeof(S1) = %d\n", sizeof(S1));
	printf("sizeof(S2) =%d\n", sizeof(S2));
	printf("sizeof(S3) =%d\n", sizeof(S3));
	printf("sizeof(U1) = %d\n", sizeof(U1));
	printf("sizeof(U2) = %d\n", sizeof(U2));
	printf("sizeof(U3) = %d\n", sizeof(U3));
	printf("sizeof(U4) = %d\n", sizeof(U4));

	return 0;
}

/**
 * 運行結果:
 * sizeof(S1) = 16
 * sizeof(S2) = 24
 * sizeof(S3) = 16
 * sizeof(U1) = 8
 * sizeof(U2) = 8
 * sizeof(U3) = 8
 * sizeof(U4) = 24
 */





發佈了12 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章