[英]Storing a Dynamic Array of Structures
我一直在研究一個利用動態結構數組的項目。 為了避免將結構數存儲在其自己的變量(結構數)中,我一直在使用指向帶有NULL
終止符的結構變量的指針數組。
例如,假設我的結構類型定義為:
typedef struct structure_item{
/* ... Structure Variables Here ... */
} item_t;
現在,假設我的代碼具有item_t **allItems = { item_1, item_2, item_3, ..., item_n, NULL };
並且所有item_#
的類型item_t *
。
然后,使用此設置,我不必跟蹤另一個告訴我項目總數的變量。 相反,我可以這樣說來確定所需的項目總數:
int numberOfStructures;
for( numberOfStructures = 0;
*(allItems + numberOfStructures) != NULL;
numberOfStructures++
);
執行此代碼時,它將計算NULL
之前的指針總數。
相比之下,該系統類似於C風格的字符串。 而跟蹤結構的總數將類似於Pascal樣式的字符串。 (因為C使用以NULL
結尾的字符數組,而Pascal跟蹤其字符數組的長度。)
我的問題很簡單,是真的需要一個指針數組(指向struct的指針)還是可以通過一個struct數組來實現(指向struct的指針)? 有人可以提供更好的方法來解決此問題嗎?
注意:該解決方案必須與C 和 C ++兼容,這一點很重要。 包裝庫正在使用此庫,該包裝庫將C ++庫包裝為在標准C中使用。
謝謝大家!
您需要的是哨兵值 ,這是一個可識別的有效值,表示“無”。 對於指針,標准哨兵值為NULL
。
如果要直接使用結構,則需要確定item_t
類型的哨兵值並進行檢查。 您的來電。
是的,可能有一個結構體數組,(至少)有一個已定義的標記(在字符串末尾使用'\\ 0',在您的情況下為NULL指針)。
對於您的結構類型,您需要做的是保留該結構的一個或多個可能值(由其成員的值組成)以指示標記。
例如,假設我們有一個struct類型
struct X {int a; char *p};
然后定義一個函數
int is_sentinel(struct X x)
{
return x.p == NULL;
}
這將意味着成員p為NULL的任何結構X都可以用作標記(在這種情況下成員a無關緊要)。
然后循環尋找哨兵。
注意:要在C和C ++中都兼容,結構類型必須兼容(例如POD)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.