问题描述
我正在实现一个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);
}
因此,我的目标显然是通过在需要时分配1倍的内存来扩展数组。但是我的实现中有一些我找不到的错误。
1-)我创建一个数组,并用少于 initialSIze 的数组填充,然后使用函数将其释放。看起来不错,但是如果我使用valgrind进行检查,则会收到以下问题,但它表示没有内存泄漏:
==11887== Invalid write of size 8
==11887== at 0x109449: freeArray (in /home/qweqwe/CLionProjects/untitled/main)
==11887== by 0x1095DE: main (in /home/qweqwe/CLionProjects/untitled/main)
==11887== Address 0x4a4e260 is 0 bytes inside a block of size 40 free'd
==11887== at 0x483CA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==11887== by 0x109441: freeArray (in /home/qweqwe/CLionProjects/untitled/main)
==11887== by 0x1095DE: main (in /home/qweqwe/CLionProjects/untitled/main)
==11887== Block was alloc'd at
==11887== at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==11887== by 0x10926D: initArray (in /home/qweqwe/CLionProjects/untitled/main)
==11887== by 0x109505: main (in /home/qweqwe/CLionProjects/untitled/main)
2-)当我尝试添加一个大于 initialSize 的元素时,第一对元素(array-> array [0] [0],array-> array [0] [1] )替换为一些随机数,(我误将它们释放了吗?)。当我执行valgrind检查时,返回大量错误消息,包括内存泄漏。如果添加更多,则会出现此错误:
free(): double free detected in tcache 2
Aborted (core dumped)
那么那里的问题是什么?我以某种方式分配了错误的内存?那我该怎么办呢?
P.S:我的第一个问题是通过从a-> array = NULL中删除*来解决的;在freeArray函数上。请帮我解决第二期问题...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)