2016-05-12 108 views
-3

我對C非常陌生,我試圖完全理解它。我實現了一個堆棧 ,但在創建析構函數和構造函數/ init時遇到了麻煩。 這些做得好嗎? 這些是由堆棧中使用的結構類型定義:C中的析構函數和構造函數C

typedef struct Node{ 
    void* cargo; 
    struct Node* next; 
}Node; 

typedef struct Stack{ 
    int size; 
    Node* firstOut; 
}Stack; 

而這些功能:

void newStack(Stack* stack){ 
    stack = (Stack*)malloc(sizeof(Stack)); 
    stack->firstOut = NULL; 
    stack->size = 0; 
} 

void freeStack(Stack** stack){ 
    empty((*stack)); 
    free((*stack)->top); 
    (*stack)->size = 0; 
    free(stack); 
} 

我的問題是:他們做得好?具有適當經驗的人會如何做到這一點?

+0

是否有任何特定的原因你的構造函數需要一個指針參數?通常情況下,帶指針的構造函數實際上是「初始化器」,因爲它們實際上不分配任何內存,只是將結構中的變量初始化爲默認值。 –

+1

你的編譯器告訴你這個代碼是什麼?具體關於'free((* stack) - > top);'? – EOF

+0

我想做很多堆棧 – patrol

回答

3

newStack應簡單地返回它分配的堆棧指針。它不需要收到Stack*作爲參數。

stack *newStack() { 
    Stack *stack = malloc(sizeof(Stack)); 
    if (stack != NULL) { // allocation successful 
     stack->firstOut = NULL; 
     stack->size = 0; 
    } 
    return stack; 
} 

and freeStack應該接收一個堆棧指針作爲參數,它不需要雙重間接。

void freeStack(Stack *stack) { 
    empty(stack); 
    free(stack->firstOut); // This isn't done by empty()? 
    free(stack); 
} 

沒有必要釋放之前設置stack->size,由於存儲器即將消失,它包含的值是不相關的。

+0

構造函數應該在解引用結果之前檢查'malloc()'的結果。 –