2016-05-12 140 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()'的结果。 –