我一直在研究一個使用動態數組結構的項目。爲了避免在自己的變量中存儲結構的數量(結構的數量),我一直使用結尾變量的指針數組,並使用終結符NULL
。存儲動態數組結構
例如,假設我的結構類型被定義爲:
typedef struct structure_item{
/* ... Structure Variables Here ... */
} item_t;
現在讓我們假設我的代碼有item_t **allItems = { item_1, item_2, item_3, ..., item_n, NULL };
和所有item_#
s爲類型item_t *
的。
使用此設置,我不必跟蹤另一個變量告訴我項目的總數。相反,我可以這樣確定需要的項目總數:
int numberOfStructures;
for(numberOfStructures = 0;
*(allItems + numberOfStructures) != NULL;
numberOfStructures++
);
當此代碼執行時,它NULL
之前計數指針的總數。
作爲比較,這個系統類似於C風格的字符串;而跟蹤結構的總數將類似於Pascal風格的字符串。 (因爲C使用一個NULL
字符終止陣列與Pascal追蹤其字符數組長度)。
我的問題很簡單,是一個指針數組(真指針指向結構體)真的必要或可能這是用一個結構數組(struct指針)完成的?任何人都可以提供更好的方法來處理這個問題?
注意:重要的是該解決方案與C 和 C++兼容。這被用在一個包裝C++庫的包裝庫中,以用於標準C.
謝謝大家!
除非您有一個簡單的方法來檢測最後一個NULL類型結構,否則通過指針使用間接方式是理想的。而且,通過指針,您可以在不移動大型結構的情況下進行重新組織,並且無需大量重新分配即可進行擴展。然而,像NULL結束的解決方案一樣光滑,遍歷整個數組以確定長度可能變成一個昂貴的操作,其中長度變量或結束指針可以減輕。 – 2015-01-31 21:48:27
一個簡單的問題:如果您存儲的某個指針碰巧設置爲NULL,那麼在該指針之後存儲的所有內容會發生什麼?很可能你會失去指針和指向內存的蹤跡,導致內存泄漏。所以我想你必須確保這一切都不會發生。 – SirDarius 2015-01-31 22:00:18
@SirDarius,這是我想到的,我希望有人可以提出一個解決方案來處理這種情況。也就是說,存儲結構的數量會帶來相同的風險,因爲'int numberOfStructures'可能很容易在某處被錯誤分配。 – SpencerD 2015-01-31 22:13:56