2015-01-31 93 views
0

我一直在研究一個使用動態數組結構的項目。爲了避免在自己的變量中存儲結構的數量(結構的數量),我一直使用結尾變量的指針數組,並使用終結符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.

謝謝大家!

+1

除非您有一個簡單的方法來檢測最後一個NULL類型結構,否則通過指針使用間接方式是理想的。而且,通過指針,您可以在不移動大型結構的情況下進行重新組織,並且無需大量重新分配即可進行擴展。然而,像NULL結束的解決方案一樣光滑,遍歷整個數組以確定長度可能變成一個昂貴的操作,其中長度變量或結束指針可以減輕。 – 2015-01-31 21:48:27

+0

一個簡單的問題:如果您存儲的某個指針碰巧設置爲NULL,那麼在該指針之後存儲的所有內容會發生什麼?很可能你會失去指針和指向內存的蹤跡,導致內存泄漏。所以我想你必須確保這一切都不會發生。 – SirDarius 2015-01-31 22:00:18

+0

@SirDarius,這是我想到的,我希望有人可以提出一個解決方案來處理這種情況。也就是說,存儲結構的數量會帶來相同的風險,因爲'int numberOfStructures'可能很容易在某處被錯誤分配。 – SpencerD 2015-01-31 22:13:56

回答

2

你需要的是一個哨點值,這是一個可識別的有效值,意思是「無」。對於指針,標準哨點值是NULL

如果你想直接使用你的結構,你需要決定item_t類型的哨兵值,並檢查它。你的來電。

+0

這就是我所害怕的。我想我會堅持使用指針數組,因爲我的代碼已經這樣寫了,而我的實際結構有一些開銷。感謝您的輸入。 – SpencerD 2015-01-31 22:24:48

1

是的,可以有一個結構數組,並且(至少)其中一個是定義的標記(這是在字符串末尾使用'\ 0',而在您的情況下使用NULL指針)。

對於結構類型,您需要做的是保留該結構的一個或多個可能值(由其成員的一組值組成)以指示標記。

例如,假設我們有一個結構類型

struct X {int a; char *p}; 

然後定義一個函數

int is_sentinel(struct X x) 
{ 
    return x.p == NULL; 
} 

這將意味着任何結構X的量,構件p是NULL可以用作一個哨兵(在這種情況下,成員a無關緊要)。

然後只是循環尋找一個哨兵。

注意:爲了兼容C和C++,結構類型需要兼容(例如POD)。