我知道这个问题存在于其他地方:
pointer being freed was not allocated in C
error: pointer being freed was not allocated
但是,我还是很困惑。错误似乎与诸如“修改malloc返回的原始指针”和“释放前未能执行malloc”之类的操作相关。我只是不明白这些理由如何适用于我的程序。
我正在编写一个动态分配的字符串数组:

#include <stdio.h>
#include <stdlib.h>

#define NLETTERS 25

typedef struct {
    char** array;
    size_t used;
    size_t size;
} array_t;

array_t* initArray(size_t initialSize) {
    array_t* a = malloc(sizeof(array_t));
    a->array = malloc(initialSize*sizeof(char*));
    a->used = 0;
    a->size = initialSize;

    int i;
    for(i = 0; i < initialSize; i++) {
        a->array[i] = malloc(sizeof(char) * NLETTERS);
    }

    return a;
}

void insertArray(array_t *a, char* element) {
    if (a->used == a->size) {
        a->size *= 2;

        a->array = realloc(a->array, a->size * sizeof(char*));

        int i;
        for(i = (int)a->used; i < a->size; i++) {
            a->array[i] = malloc(sizeof(char) * NLETTERS);
        }
    }
    a->array[a->used++] = element;
}

void freeArray(array_t *a) {
    int i;
    for(i = 0; i < a->size; i++) {
        free(a->array[i]);
    }

    free(a->array);
    free(a);
    a->array = NULL;
    a->used = a->size = 0;
}

void print_array(array_t *a) {
    int i;
    for(i = 0; i < a->size; i++) {
        printf("%s\n", a->array[i]);
    }
}

int main(int argc, const char * argv[]) {
    array_t *a;
    a = initArray(2);
    insertArray(a, "hello");
    insertArray(a, "how are you");
    print_array(a);
    insertArray(a, "yup");
    insertArray(a, "you know it");
    print_array(a);

    freeArray(a);

    return 0;
}

当我试图“释放”时,我得到一个错误:“被释放的指针没有被分配”
就在
free(a->array[0])

在freeArray()中for循环的第一次迭代中;
我们将非常感谢您的帮助。

最佳答案

在你的代码中,通过说

  a->array[a->used++] = element;

您正在用malloc()覆盖分配的内存,因此,稍后在将其传递给free()时会导致问题。
相关,引用C11,第7.22.3.3章,free函数,(强调矿山)
free函数使ptr指向的空间被释放,即
可供进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果
参数与内存管理先前返回的指针不匹配
函数,或者如果通过调用free或realloc释放了空间,则
行为未定义。
另外,在稍后的一点上,这会导致memory leak,因为malloc()分配的内存实际上没有得到free()-d。
解决方案:您应该使用strcpy()将内容复制到分配的内存中。

关于c - 释放的指针未分配给C中的字符串数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40857626/

10-13 08:29