我在动态数组中实现了一个堆栈。以下是我的一些功能。当我调用stk_reset函数时,似乎堆栈没有被完全释放。
这是我的结构。要求我必须在struct内部指向动态数组
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;
}
如何释放包含堆栈的数组的每个元素?我使用了这个语句free((s-> items)++)和for循环,但它不起作用。
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 :(得分:1)
你只能在free
返回给你的指针上调用malloc
,你只能释放整个块,而不是单个字节。
答案 1 :(得分:0)
您希望每次拨打free
时拨打malloc
一次。在这里,您只分配了一个带有两个字符空间的项目。至free
,它非常简单。这就是所谓的“安全”发布(或免费)。
if (s->items != NULL) {
free(s->items);
s->items = NULL; // Reset to be safe.
}
虽然要使用它,但在尝试使用它之前,您需要确保将值初始化:s->items = NULL;
。
不需要其他free
次调用,当您只有一个malloc
时,肯定不在循环中。