struct中長度為0的陣列用途與原理

2021-08-21 00:26:35 字數 1072 閱讀 9688

在標準c和c++中,長度為0的陣列是被禁止使用的。不過在gnuc中,存在乙個非常奇怪的用法,那就是長度為0的陣列,比如array[0]; 很多人可能覺得不可思議,長度為0的陣列是沒有什麼意義的,不過在這兒,它表示的完全是另外的一層意思, 這個特性是不可移植的, 所以,如果你致力於編寫可移植,或者是稍稍需要跨平台的**,這些trick最好還是收起來的好。

本系列文章均係筆者所寫,難免有一些錯誤或者紕漏,如果小夥伴們有好的建議或者更好的演算法,請不吝賜教。

在gnu的指南中,它是如此寫道:

struct

line ;

//...ommit code here

這個用法主要用於變長buffer,structline的大小為4,結構體中的contents[0]不占用任何空間,甚至是乙個指標的空間都不佔, contents在這兒只是表示乙個常量指標,這個特性是用編譯器來實現的,即在使用thisline->contents的時候, 這個指標就是表示分配記憶體位址中的某塊buffer,比如malloc(sizeof (struct line) +this_length)返回的是0x8f00a40,thisline->contents指向的位置就是(0x8f00a40+ sizeof(struct line)),而這兒sizeof(struct line)僅僅是乙個int的四位元組。

對於這個用法,我們定義的結構體指標可以指向任意長度的記憶體buffer,這個技巧在變長buffer中使用起來相當方便。可能有朋友說,為什麼不把最後的contents直接定義為乙個指標呢?這兒的差別是這樣的,如果定義為乙個指標,它需要占用4bytes,並且在申請好記憶體後必須人為賦位址才可以。如果使用這個用法,這個常量指標不占用空間,並且無需賦值。 但是,方便並不是絕對的,在釋放分配的記憶體的時候,由於函式free會認為*thisline只是指向乙個4位元組的指標,即只會釋放length的空間,而對於後面佔據大頭的buffer卻視而不見,這個就需要人為干預;而對於後面的宣告指標的方式,則可以直接用free(thisline->contents)的方式釋放掉分配的記憶體。

assert:除非必要,不要輕易使用這個功能,gnuc下可以編譯通過,所以你在使用vc++,那就不用嘗試了,編譯都無法通過。

出處:

C C 中長度為0的陣列

參考文獻 近日在看專案中的框架 時,發現了了乙個奇特的語法 長度為0的陣列例如 uint8 t buf 0 我從未見過這樣的寫法,所以在網上查了查資料,了解並記錄下來.在標準的c c 中,長度為0的陣列是不被允許的,它算是乙個c c 擴充套件,如果你的編譯器支援這個擴充套件,你就可以使用它.vs系列...

C語言長度為0的陣列

前面在看xen 的原始碼時,遇到了一段 如下所示 注意上面最後一行的 這裡定義了乙個長度為的陣列,這種用法可以嗎?為什麼可以使用長度為 0 的陣列?長度為 的陣列到底怎麼使用?這篇文章主要針對該問題進行簡單的講解。廢話不多說了,現在就開始。長度為的陣列在標準c和 c 中是不允許的,如果使用長度為 的...

長度為0的字元陣列的賦值

結構體格式如下 struct ss t 需要給結構體中的msg賦值,由於msg的長度為0,直接賦值時程式提示賦值錯誤,經過處理之後,可以使用以下方式賦值 int totallen int command char msg 123456 int testlen sizeof msg char buf ...