2014-02-13 23 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你只能释放整个块,而不是单个字节。