C 试图释放2D动态分配数组时,程序崩溃
一般来说,很难理解发生了什么以及为什么。 在程序的开头,我声明了两个2D动态数组(程序中使用的所有数组都具有相同的维度): 然后我分配必要的内存:C 试图释放2D动态分配数组时,程序崩溃,c,dynamic-memory-allocation,dynamic-arrays,C,Dynamic Memory Allocation,Dynamic Arrays,一般来说,很难理解发生了什么以及为什么。 在程序的开头,我声明了两个2D动态数组(程序中使用的所有数组都具有相同的维度): 然后我分配必要的内存: //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 (init
//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));
}
然后我将这些值存储到初始数组中:
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);
(i=0;i的
,因为您的第一次分配错误
initial_array = calloc(N,sizeof(int));
new_array = calloc(N,sizeof(int));
应该是
initial_array = calloc(N,sizeof(int *));
new_array = calloc(N,sizeof(int *));
很可能您正在64位
OS上尝试这段代码,否则它可能无法正常工作
此外,您还可以覆盖指针新数组
,无需执行此操作
new_array = calloc(N,sizeof(int));
或者在for
循环中
既然你有这个
new_array = create_new_array(some_data, initial_array);
最后是评论
free_array_in_function(new_array);
因为您将释放同一指针两次。当您尝试访问中的arryays时
free(initial_array[i]);
您正在解除对已释放的指针的引用
指针不是这样工作的,一旦你第一次拥有一个指针,即一个表示虚拟地址的整数值,如果你再次calloc
并分配给上一个指针,那么你就会覆盖地址,从而导致内存泄漏
然后您可以free
使用create\u new\u array
函数分配的指针,但是您不能free
第一个calloc
ed指针,因为您丢失了对它的引用。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));
在free\u array\u In\u函数(新建\u array)
中,您正在释放内存,这正是您释放内存的原因
获取错误。您两次释放内存的原因。如果要显式初始化数组,请使用malloc
而不是calloc
。这可能是malloc的语法否?我认为calloc是这样的。我试过了,但没有解决问题。@kat请发布您的创建新的\u数组
函数。我还应该更改第二次分配,因为你们都给了我相同的解决方案,但我有相同的问题。@kat还有什么是free_array_in_函数
?在create_new_array中,你正在进行任何内存分配。你能发布吗???@Karthikeyan.R.S我只是在问题中发布了它。在free_array_in_函数中,你正在释放内存记忆???@Karthikeyan.R.S是的,我记得。
new_array[i] = calloc(P, sizeof(int));
new_array = create_new_array(some_data, initial_array);
free_array_in_function(new_array);
free(initial_array[i]);
int **initial_array = calloc(N,sizeof(int *));
int **new_array = calloc(N,sizeof(int *));
initial_array[i] = calloc(P,sizeof(int));