2013-03-05 82 views
2

我有一大堆的結構,所有看起來像重新分配動態鏈接結構的表用C

typedef struct { 
    A[1..100] *next; // this is not an array, just indicating A1 or A2 or A3 and so on 
    //other stuff that varies from struct to struct 
} A[1..100] // A1, A2, and so on 

我產生不同的同類型結構的幾個鏈表。在某處一個功能,我的東西分配內存喜歡

A55 *struct_list; 
A55 *next_in_list; 

struct_list = (A55 *)malloc(sizeof(A55)); 
(*struct_list).next = NULL; 

//some loop 
    next_in_list = (A55 *)malloc(sizeof(A55)); 
    (*next_in_list).next = struct_list; 
    struct_list = next_in_list; 

在循環結束時,struct_list是一個指針鏈表的末尾。

我想有一個單獨的函數,可以釋放任何列表,而不管填充它的結構如何。我覺得有以下可能的工作,但我需要的東西,它不會破壞任何規則和可能實現安全:

void freeStruct(*void start){ 

    void ** current, * next; 
    current = (void **) start; 

    do{ 
     next = *current; 
     free(current); 
     current = (void **) next; 
    }while(current != NULL) 
    } 

我的問題是NULL是否爲所有的指針所有類型,包括struct相同的數值。而且,有沒有更好的方法可以做到這一點,而不必爲不同的struct定義複製相同的功能100次?

回答

2

NULL總是具有相同的值:0。

你可以做你想做的。做到這一點的方法是將「下一個」指針放在結構的最開始處,因此每個結構始終位於相同的位置。

如果你有更多的結構而不是單個「下一個」指針,你應該把一個結構全部放在它之外,然後把結構放在每個結構的開始。例如,如果你將使用「prev」和「next」指針創建一個雙向鏈表,我建議用這兩個指針做一個結構。

如果每個結構都可以簡單地釋放,您可以在每個指針上調用free()函數。如果您有時需要運行清理函數,則應該使通用鏈接列表釋放函數獲取指向清理函數的指針,並在清單到達列表時調用每個結構的清理。

+0

Null僅在編譯時爲0,它在運行時依賴於實現(AFAIK)。所有'next'指針都在'struct'的開頭。 – Ivan 2013-03-05 22:25:27

+0

討論NULL的合法值:http://stackoverflow.com/questions/2599207/can-a-conforming-c-implementation-define-null-to-be-something-wacky但根據我的經驗,我從未見過NULL是除0之外的任何值。這包括Windows,Mac,Linux和嵌入式。而且,有很多代碼可以處理像'while(ptr-> next){do_something(ptr); ptr = ptr-> next}'和一個非零的NULL會破壞所有的代碼,所以我認爲任何平臺都不符合通常的做法是使NULL爲0。 – steveha 2013-03-05 22:41:43

0

您需要遍歷整個列表,同時釋放指針。