C中结构中指针指向的自由数组

C中结构中指针指向的自由数组,c,arrays,pointers,memory-management,struct,C,Arrays,Pointers,Memory Management,Struct,我在动态数组中实现了一个堆栈。下面是我的一些功能。当我调用stk_reset函数时,堆栈似乎没有完全释放 这是我的结构。我需要在struct中有一个指向动态数组的指针 typedef struct stack { char *items; int arrSize; int top; } StackStruct; void stack_create(StackStruct *s) { char *arr =

我在动态数组中实现了一个堆栈。下面是我的一些功能。当我调用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;
    }
void stk_重置(StackStruct*s){
int i;
对于(i=0;i=1;i++)
免费((s->items)+);
免费->项目;
s->items=NULL;
s->top=-1;
s->arrSize=0;
}

您只能在
malloc
返回给您的指针上调用
free
,并且只能释放整个块,而不能释放单个字节。

您希望每次调用
malloc
时调用
free
。在这里,您只分配了一个项目,可容纳两个字符。要想免费它,这很简单。这就是所谓的“安全”释放(或免费)

尽管要使用它,您需要确保在尝试使用它之前将值初始化为NULL:
s->items=NULL


不需要其他的
free
调用,当您只有一个
malloc

时,当然也不需要在循环中调用。您应该了解
malloc
free
做什么,在一个简单的示例中练习使用它们,然后重新审视您的设计。
free()
不是这样工作的。
if (s->items != NULL) {
    free(s->items);
    s->items = NULL; // Reset to be safe.
}