Linux C程式設計 sizeof面試題選

2021-07-24 20:30:41 字數 1509 閱讀 5667

結構體和共用體的記憶體分配是c語言的乙個難點,也是面試題中的熱點。 

示例1: 

union data1 ;

sizeof(union data1)的值為16.在編譯器預設設定的情況下,該共用體最大基本型別為double,它佔8位元組,所以此共用體以8來對齊。字元陣列c2佔9個位元組,那麼整個共用體應該佔9個位元組,但按照對齊原則,實際分配給它的記憶體為16位元組。

如果是:

struct data1 ;

sizeof(struct data1)的值為24,首先按照儲存大小,該結構體所佔儲存空間為:8+4+1+9=22位元組,這個結構體也是以8對齊,因此實際分配的是24位元組。

示例2:

union data2 ;

sizeof(union data2)的值為12,該共用體占記憶體空間最大的基本資料型別為int,其長度為4,所以該共用體以4來對齊。該共用體的長度取決於字元c2,其長度為9,9不是4的倍數,要進行對齊,因此實際分配的儲存空間為12.

struct data2 ;

sizeof(struct data2)的值為16,與上面共用體一樣,該結構體以4對齊。按照儲存大小,該結構體所佔儲存空間為:4+1+9=14,14不是4的倍數,進行對齊,對齊後的值為16.

示例3:

union data3 ;

sizeof(union data3)的值為3,該共用體占記憶體空間最大的基本資料型別為chart,其長度為1,所以該共用體以1來對齊。該共用體的長度取決於字元c2,其長度為3,因此分配的儲存空間為3.

struct data3 ;

sizeof(struct data3)的值為3,與上面共用體一樣,該結構體以1對齊。按照儲存大小,該結構體所佔儲存空間為:1+2=3位元組。

示例4:

struct inner ;

這個結構體顯然是8位元組對齊的,在給c1分配儲存空間時,考慮到對齊,分配給c1的位元組數就是8,然後給d分配8位元組,最後給c2分配時,因為也要以8對齊,所以也分配了8個位元組的儲存空間。所以sizeof(struct inner)值為24.

如果是:

struct inner ;

當然這個結構體也是以8位元組對齊的,編譯器編譯程式時,給c1、c2分配儲存空間沒有必要各自給它們分配8位元組,只要8位元組就可以了。給d分配8位元組,所以sizeof(struct inner)值為16.

struct inner ;

union data4 ;

由於data4共用體中有乙個inner結構體,所以最大的基本資料型別為double,因此以8位元組對齊。共用體的儲存長度取決於t1,而t1長度為24,因此sizeof(union data4)的值為24.

struct inner ;

struct data4 {

struct   inner t1;

int i;

char c;

Linux C程式設計 sizeof面試題選

結構體和共用體的記憶體分配是c語言的乙個難點,也是面試題中的熱點。示例1 union data1 sizeof union data1 的值為16.在編譯器預設設定的情況下,該共用體最大基本型別為double,它佔8位元組,所以此共用體以8來對齊。字元陣列c2佔9個位元組,那麼整個共用體應該佔9個位...

linux c 程式設計

linux下為了安全性不能雙擊執行控制台程式,只有gui程式才能雙擊執行.linux下檔案的型別是不依賴於其字尾名的,但一般來講 o,是目標檔案,相當於windows中的.obj檔案 so 為共享庫,是shared object,用於動態連線的,和dll差不多 a為靜態庫,是好多個.o合在一起,用於...

Linux C程式設計

套接字 sockets 即為網路程序id,是由執行這個程序的計算機的ip位址和這個程序使用的埠 port 組成.可以只用 netstat all 檢視當前系統中網路應用程序的套接字和埠.可以使用 輸出重定向到檔案.linux在標頭檔案中定義了通用的套接字結構型別,可供不同協議呼叫 struct so...