C 试图释放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

一般来说,很难理解发生了什么以及为什么。 在程序的开头,我声明了两个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 (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));