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

时间:2014-02-13 01:19:45

标签: 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 = 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;
    }

2 个答案:

答案 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时,肯定不在循环中。