2016-05-12 13 views
-3

私はC言語の新機能ですが、まだ完全に理解しようとしています。私はスタック を実装しましたが、デストラクタとコンストラクタ/ initを作成するときに問題が見つかりました。 これらはうまくいっていますか? これらは、スタックによって使用される構造のためのtypedefです:デストラクタと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; 
} 

freeStackが引数としてスタックポインタを受けなければならない、それは二重の間接を必要としません。

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

メモリが離れて行くために起こっているとそれに含まれる値が無関係であることから、解放する前に、stack->sizeを設定する必要はありません。

+0

コンストラクタは結果を逆参照する前に 'malloc()'の結果をチェックする必要があります。 –

関連する問題