struct中的陣列和指標

2021-08-04 23:29:34 字數 1728 閱讀 1347

這裡可以看出來兩點:

1.struct的記憶體對齊是按照成員最大的那乙個來的

2.陣列在struct中不佔大小

重點說第2個,在linux核心**中屢見不鮮! 這個用法主要用於變長buffer,test1的大小為4,結構體中的data[0]不占用任何空間,甚至是乙個指標的空間都不佔,data在這兒只是表示乙個常量指標,這個特性是編譯器來實現的,即在使用test1.data的時候,這個指標就是表示分配記憶體位址中的某塊buffer,比如:

_test1 *test1 = malloc(sizeof (_test1) + data_len);

test1->len = data_len;

memcpy(test1->data, buffer, data_len);

對於這個用法,我們定義的結構體指標可以指向任意長度的記憶體buffer,這個技巧在變長buffer中使用起來相當方便。可能有朋友說,為什麼不把最後的data直接定義為乙個指標呢?這兒的差別是這樣的,如果定義為乙個指標,它需要占用4bytes,並且在申請好記憶體後必須人為賦位址才可以使用。比較一下定義指標的用法:

_test2 test2 = malloc(sizeof (_test2));

test2.len = data_len;

test2->data = malloc(data_len);

memcpy(test2->data, buffer, data_len);

free(test2->data);

free(test2)

總結:

1.儲存大小方面,test1的儲存比test2要少,[0]的好處,即用指標的方式需要多開闢儲存空間的。

2.資料連續儲存方面,test2明顯data是單獨開闢的空間,與前面的len不在連續的儲存區域,而test1的兩個成員則在連續的儲存空間下。

3.釋放記憶體方面,test2的指標的方式,需要先釋放data部分,才能釋放指向結構體的指標變數,而test1可以直接釋放。

結構體最後使用0或1的長度陣列的原因,主要是為了方便的管理記憶體緩衝區,如果你直接使用指標而不使用陣列,那麼,你在分配記憶體緩衝區時,就必須分配結構體一次,然後再分配結構體內的指標一次,(而此時分配的記憶體已經與結構體的記憶體不連續了,所以要分別管理即申請和釋放)。

而如果使用陣列,那麼只需要一次malloc就可以全部分配出來,反過來,釋放時也是一樣,使用陣列,一次釋放,使用指標,得先釋放結構體內的指標,再釋放結構體。還不能顛倒次序。

其實變長結構體就是分配一段連續的的記憶體,減少記憶體的碎片化,簡化記憶體的管理。

4.變長結構體的應用,socket通訊資料報的傳輸。這個用法在我們公司的很多網路協議處理的地方都這麼使用。

最後gnuc下可以編譯通過,所以你在使用vc++,那就不用嘗試了,編譯都無法通過!

struct 結構體中對陣列和指標的操作細節

我們需要明確兩個概念 a 初始化 分配記憶體並寫入值。b 賦值 查詢記憶體並寫入值。在結構體中,陣列和指標最大的的區別為 陣列將資訊存在結構體所占有的記憶體中,而指標是將資訊的首位址儲存在結構體所占有的記憶體中,例如 typedef struct namename name a 結構體物件a中的陣列...

C中的陣列和指標

在這裡隨便定義乙個陣列 int arr 5 arr現在就是陣列名,arr 代表的是該陣列整塊記憶體,即sizeof arr 20 假設sizeof int 4 arr 裡的內容是該塊記憶體的首位址,即 arr arr 0 arr可以看做是乙個常量,也就不可以使用 arr 之類的運算。int p p ...

C 中的陣列和指標

1 include 2 include 34 using namespace std 56 intmain 7 9int p 2 10 p k 11 cout 0 0 p 0 1 p 2 1213 return0 14 輸出 10,20,50 c語言英語的表達 中文的表現 int hoge hoge...