C 二维数组的动态分配会导致内存泄漏
我正在实现一个2D矩阵,每行2列,用于存储来自文本文件的数据,我不知道行数。因为我不知道它的大小,所以我尝试在以下实现需要时重新分配它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
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)