![](/img/trans.png)
[英]Program crashes when trying to assign value to a dynamically allocated 2D array
[英]Program crashes when trying to free a 2D dynamic allocated array
通常,很難理解發生了什么以及為什么發生。 在程序的開頭,我聲明了兩個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動態數組,我將其打印(在函數內部)並釋放(通過調用另一個函數)而沒有問題,然后將該數組存儲到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;
}
因為您的第一次分配是錯誤的
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
OS上嘗試此代碼,否則它可能會很痛苦。
另外,您會覆蓋不需要的指針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);
因為您要釋放兩次相同的指針。 當您嘗試訪問arryays時
free(initial_array[i]);
您正在取消引用已經釋放的指針。
指針不是這樣工作的,一旦您第一次調用calloc
,便有了一個pointer
即表示內存虛擬地址的整數值,如果再次調用calloc
並將其分配給前一個指針,則將覆蓋地址並因此導致內存泄漏。
然后你free
你分配的指針create_new_array
功能,但你不能free
第一calloc
版指針,因為你已經失去了對它的引用。
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));
在free_array_in_function(new_array)
您正在釋放內存,這是您收到錯誤的原因。 您釋放內存兩次的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.