一般来说,很难理解发生了什么以及为什么会发生。 在程序的开头我声明了两个2D动态数组(程序中使用的所有数组都有相同的维度):
int **initial_array;
int **new_array;
然后我分配必要的记忆:
//dynamic allocate arrays (1st Dimension)
initial_array = calloc(N,sizeof(int));
new_array = calloc(N,sizeof(int));
//check if the memory has been allocated correctly
if (initial_array==NULL || new_array==NULL)
{
printf("Error allocating memory!\n"); //print an error message
return 1; //return with failure
}
for (i=0;i<N;i++)
{
//dynamic allocate arrays (2nd Dimension)
initial_array[i] = calloc(P, sizeof(int));
new_array[i] = calloc(P, sizeof(int));
}
然后我调用一个函数来获取初始数组的值,生成另一个2D动态数组,我打印(在函数内部)和free(通过调用另一个函数)没有问题,我将这个数组存储到new_array:
new_array = create_new_array(some_data, initial_array);
然后我将值存储到initial_array:
for (i=0;i<N;i++)
{
for (p=0;p<P;p++)
{
initial_array[i][p] = new_array[i][p];
}
}
free_array_in_function(new_array);
到目前为止一切顺利。当我释放数组时问题就来了。 initial_array非常有效:
//free memory
for (i=0;i<N;i++)
{
free(initial_array[i]);
}
free(initial_array);
然后,我尝试使用new_array,但程序崩溃了:
//free memory
for (i=0;i<N;i++)
{
free(new_array[i]);
}
free(new_array);
ERROR: Unhandled exception at 0x102d12b4 (msvcr90d.dll) in Genetic_v1.exe:
0xC0000005: Access violation reading location 0xfeeefee8.
任何想法为什么会发生这种情况?
//Function
int **create_new_array(double *some_data, int **individuals_table)
{
int **children;
//dynamic allocate array of children (1st Dimension)
children = calloc(N,sizeof(int));
//check if the memory has been allocated correctly
if (children==NULL)
{
printf("Error allocating memory!\n"); //print an error message
return 1; //return with failure
}
for (cv01=0;cv01<N;cv01++)
{
//dynamic allocate array of Individuals (2nd Dimension)
children[cv01] = calloc(P, sizeof(int));
//check if the memory has been allocated correctly
if (children[cv01]==NULL)
{
printf("Error allocating memory!\n"); //print an error message
return 1; //return with failure
}
}
//Do some calculations
return children;
}
答案 0 :(得分:3)
因为你的第一次分配是错误的
initial_array = calloc(N,sizeof(int));
new_array = calloc(N,sizeof(int));
应该是
initial_array = calloc(N,sizeof(int *));
new_array = calloc(N,sizeof(int *));
很有可能你在64bit
操作系统上尝试使用此代码,否则它可能会偶然发生。
同样,你覆盖了你不需要的指针new_array
new_array = calloc(N,sizeof(int));
或在for
循环
new_array[i] = calloc(P, sizeof(int));
因为你有这个
new_array = create_new_array(some_data, initial_array);
最后发表评论
free_array_in_function(new_array);
因为你正在释放两次相同的指针。当你试图访问
中的arryaysfree(initial_array[i]);
您正在取消引用已经免费的指针。
如果您calloc
第一次有pointer
,即表示内存虚拟地址的整数值,那么这不是指针的工作方式,如果再次calloc
并指定到前一个指针,然后你覆盖地址,从而导致内存泄漏。
然后你free
使用create_new_array
函数分配的指针,但你不能free
第一个calloc
ed指针,因为你丢失了对它的引用
答案 1 :(得分:3)
sizeof(int)
与sizeof(int *)
不同。甚至某些时候它可能是相同的,具体取决于你需要在这里使用sizeof(int *)
的平台,即分配内存来保存你的指针。
为了你的
int **initial_array = calloc(N,sizeof(int *));
int **new_array = calloc(N,sizeof(int *));
稍后您需要单独为指针分配内存。 现在你应该:
initial_array[i] = calloc(P,sizeof(int));
答案 2 :(得分:2)
在free_array_in_function(new_array)
中,你释放的内存就是你的原因
得到错误。你释放内存两次的原因。