C 二维数组的动态分配会导致内存泄漏

C 二维数组的动态分配会导致内存泄漏,c,memory-leaks,segmentation-fault,valgrind,realloc,C,Memory Leaks,Segmentation Fault,Valgrind,Realloc,我正在实现一个2D矩阵,每行2列,用于存储来自文本文件的数据,我不知道行数。因为我不知道它的大小,所以我尝试在以下实现需要时重新分配它 typedef struct { int **array; size_t used; size_t size; } Array; void initArray(Array *a, size_t initialSize) { a-> array = (int **)malloc(initialSize * sizeof(in

我正在实现一个2D矩阵,每行2列,用于存储来自文本文件的数据,我不知道行数。因为我不知道它的大小,所以我尝试在以下实现需要时重新分配它

typedef struct {
    int **array;
    size_t used;
    size_t size;
} Array;

void initArray(Array *a, size_t initialSize) {
    a-> array = (int **)malloc(initialSize * sizeof(int *));
    for (int i = 0; i < initialSize; i++)
    {
        a->array[i] = (int *) malloc(2 * sizeof(int));
    }
    a->used = 0;
    a->size = initialSize;
}
void insertArray(Array *a, int firstValue, int secondValue) {

    if (a->used == a->size) {
        a->size *= 2;
        *a->array = (int *) realloc(a->array, a->size * sizeof(int));
        for (int i = a->used; i < a->size; i++)
        {
            a->array[i] = (int *) malloc(2 * sizeof(int *));
        }
    }
    a->array[a->used][0] = firstValue;
    a->array[a->used][1] = secondValue;
    a->used++;
}
void freeArray(Array *a)
{
    for(int i=0; i < a->size; i++)
    {
        free(a->array[i]);
    }
    free(a->array);
    *a->array = NULL;
    a->used = 0;
    a->size = 0;
}
//For easy debugging I added a dummy main
int main(int argc, char *argv[]) {
    Array array;
    initArray(&array, 5);
    for(int i=0; i<123; i++)
    {
        insertArray(&array, i, i+1);
    }
    freeArray(&array);
}
2-)当我尝试添加一个大于initialSize的元素时,第一对元素(数组->数组[0][0],数组->数组[0][1])被替换为一些随机数,(我错误地释放了它们?)。当我执行valgrind检查时,返回大量错误消息,包括内存泄漏。如果我添加更多,则会出现以下错误:

free(): double free detected in tcache 2
Aborted (core dumped)
那问题是什么呢?不知为什么,我的内存分配错了?那我该怎么做呢


附言:我的第一个问题通过从->数组中删除*来解决;在freeArray函数中。请帮我解决第二个问题…

*a->array=NULL=那里有一种糟糕的魔力。只是说说而已。您可能想要
a->array=NULL@WhozCraig是的,将其更改为->数组=null;解决了第一个问题,谢谢!看到类似的东西了吗<代码>*a->array=(int*)realloc(…
)就是我所指的。我不知道你为什么要在这两种情况下都使用deref操作符。后者应该是
a->array=realloc(a->array,a->size*sizeof(int*);
。而嵌入for循环中的应该使用
sizeof(int)
,而不是
sizeof(int*)
@WhozCraig是的,我现在很惭愧..哈哈哈
*a->array=NULL;
=那里的魔咒不好。只是说。你可能想要
a->array=NULL;
@WhozCraig是的,把它改成a->array=NULL;解决了第一个问题,谢谢!看到类似的东西了吗?
*a->array=(int*)realloc(…
就是我所指的。我不知道你为什么要在这两种情况下都应用deref操作符。后者应该是
a->array=realloc(a->array,a->size*sizeof(int*);
。而嵌入for循环中的应该使用
sizeof(int)
,而不是
sizeof(int*)
@WhozCraig是的,我现在很惭愧..哈哈
free(): double free detected in tcache 2
Aborted (core dumped)