C 零長度陣列,這聽起來可能有點奇怪,因為它不分配記憶體空間來儲存資料。 但實際上,零長度陣列在 Linux 核心中無處不在。
首先,我們需要了解什麼是零長度陣列。 簡單來說,零長度陣列是長度為 0 的陣列,即不包含任何元素的陣列。 零長度陣列在 C99 標準中引入,並在 C11 中進一步支援。 定義很簡單,它是乙個大小為 0 的陣列。 例如:
int a[0];在 Linux 核心中,零長度陣列通常不用作零長度陣列,而是作為結構中的最後乙個元素,與動態記憶體分配結合使用。
在 Linux 核心中,零長度陣列通常被用作結構末尾的佔位符,以表示結構的可變長度部分。 例如,表示網路套接字的 struct sockaddr 結構可能如下所示:
在此示例中,sa 資料字段實際上是乙個填充字段,用於儲存來自不同位址系列的位址資料。 由於位址族可以不同,所需的資料長度也可以不同,因此這裡使用足夠大的固定長度陣列。 但是,如果使用長度為零的陣列,則 ** 會更清晰:
在實踐中,核心將結合動態記憶體分配設定所需的 SA 資料長度並填充相關資料。 零長度陣列可以與 kmalloc 和 vmalloc 等記憶體分配函式結合使用來實現這種動態分配,因此也有人稱零長度陣列為靈活陣列。
在 Linux 核心或其他用 C 語言編寫的低階系統中,零長度陣列通常用作靈活資料結構的一部分,尤其是在需要動態增長或收縮的陣列中。 下面是乙個如何在核心程式設計中使用零長度陣列實現可變長度整數陣列的簡單示例
在此示例中,忽略核心模組並專注於變數 int 陣列函式。
我們定義了乙個名為變數 int 陣列的結構,它包含乙個長度欄位和乙個零長度陣列資料。 使用 create int array 函式分配記憶體並初始化結構體,使用 destroy int array 函式釋放記憶體。 Add int to array 函式允許我們向陣列新增新的整數,並且它會動態地重新分配記憶體以容納新新增的元素。 最後,使用 print int 陣列函式列印出結構體中整數動態陣列成員的值。
讓我們來看看金鑰**的實現。
create int array 函式建立乙個可變長度整數陣列的新變數 int 陣列結構,函式引數 initial length 是陣列的初始長度。 第 13 行使用 kmalloc 動態分配結構體的初始記憶體空間,其中包括結構體本身和初始長度為初始長度的整數陣列的空間。 第 24 行是將初始長度(即初始資料長度值)儲存在結構體的 length 成員中,因為長度不是 0,而是初始長度。
destroy int 陣列是呼叫 kfree 釋放上面建立的記憶體空間,比較簡單。
重點關注 Add int to Array(struct variable int array **array ptr, int value) 函式,這是動態新增新整數值到陣列中最麻煩的過程。
第乙個引數是結構陣列 ptr,它是指向舊結構體內存的第乙個位址的二級指標,請注意,新分配的記憶體空間位址儲存在此指標變數中。 第二個引數值是已新增的新整數值。
第 43 行是將舊的結構標頭位址儲存在陣列指標中。
第 44 行 new length 暫時保留陣列的長度。
第 47 行分配新的記憶體空間並將第乙個位址儲存在陣列變數中,注意從現在開始陣列指向新空間。 因為陣列中新增了新的整數,所以空間變大,需要重新分配,新分配的空間大小包括之前的結構長度和新新增的整數的空間大小。
第 59 行是將舊的陣列資料複製到新的陣列空間中。
第 62 行是將新整數值新增到新陣列空間的最後乙個位置,並更新陣列空間的資料。
第 66 行將結構體的長度成員更新為新的長度,實際上是 1。
第 69 行,舊結構的所有記憶體被釋放,因為隨著長度的增加,新記憶體被分配。
第 72 行是將新的空間位址分配給陣列 ptr 指標變數,即使指向舊結構頭位址的指標指向新的結構頭位址,僅此而已。
簡單地說,長度為零的陣列是長度為 0 的陣列。 但在程式設計中,它通常用作佔位符,或作為結構的最後乙個元素,這提供了在結構中儲存更多資料的靈活性。
那麼,零長度陣列的價值和意義是什麼?
靈活性:零長度陣列允許我們在不知道確切需要多少儲存空間的情況下分配基本結構。 這樣,我們可以在後續程式執行中根據需要動態地將資料新增到這個零長度陣列中。 這種靈活性對於處理可變大小的資料非常有用。
記憶體效率:通過動態地將記憶體分配給零長度的陣列,我們可以避免首先分配過多的記憶體,從而可以更有效地利用記憶體資源。 只有當我們真正需要它時,才會分配額外的記憶體。
簡化**:在某些情況下,可以通過使用零長度陣列來簡化結構。 例如,我們可以將一些相關資料放在乙個結構體中,並且可以使用零長度陣列作為該結構體的最後乙個元素來儲存額外的資料。 通過這種方式,我們可以更輕鬆地管理和操作這些資料。
後續系列優質文章將持續更新,碼詞不易,歡迎關注、點讚、收集提問。