2014-02-13 24 views
1

我有一個在動態數組中實現的棧。以下是我的一些功能。當我調用stk_reset函數時,似乎堆棧沒有完全釋放。在一個結構中的指針指向的自由數組C

這是我的結構。這是我必須有指向結構內部的指針動態數組

typedef struct stack { 
     char *items; 
     int arrSize; 
     int top; 
    } StackStruct; 


    void stack_create(StackStruct *s) { 
     char *arr = malloc(sizeof(char)*2); 

     if (arr == NULL) { 
      printf("Insufficient memory to initialize stack.\n"); 
      return; 
     } 

     s->arrSize = 2; 
     s->items = arr; 
     s->top = -1; 
    } 

如何解除分配列保持堆棧的每一個元素的要求?我用for循環免費((s-> items)++)這個語句,但它不起作用。

void stk_reset(StackStruct *s) { 
    int i; 

     for (i = 0; i <= s->arrSize; i++) 
      free((s->items)++); 
     free(s->items); 
     s->items = NULL; 
     s->top = -1; 
     s->arrSize = 0; 
    } 
+0

你應該學習'malloc'和'free'做什麼,在一個簡單的例子中練習使用它們,然後重新訪問你的設計。 –

+1

'免費()'不這樣工作。 – tangrs

回答

0

您需要撥打撥打malloc一(1)個電話。在這裏,您只分配了一個空間用於兩個字符的項目。到free它,它非常簡單。這就是所謂的「安全」版本(或免費)。

if (s->items != NULL) { 
    free(s->items); 
    s->items = NULL; // Reset to be safe. 
} 

雖然使用這個,你需要確保你嘗試之前使用它,你初始化您的值設置爲NULL:s->items = NULL;

沒有其他free調用是必需的,並且當你只有一個malloc時肯定不會在循環中。

1

只能調用上的指針free返還給您的malloc你只能釋放整個塊,而不是單個字節。