下面显示的是一段用C编写的代码,目的是在函数内重新分配内存。我想知道为什么这会在执行过程中崩溃,也是一种有效的方法。
int main()
{
int *kn_row, *kn_col, *uk_row, *uk_col;
double *kn_val, *uk_val;
kn_row=NULL, kn_col=NULL, kn_val=NULL, uk_row=NULL, uk_col=NULL, uk_val=NULL;
evaluate_matrices(&kn_row, &kn_col, &kn_val, &uk_row, &uk_col, &uk_val);
........
}
我尝试了两种类型的功能:
evaluate_matrices(int **ptr_kn_row, int **ptr_kn_col, double **ptr_kn_val,
int **ptr_uk_row, int **ptr_uk_col, double **ptr_uk_val)
{
........
/* i,j, and k are calculated */
*ptr_kn_row=(int*)realloc(*ptr_kn_row,k*sizeof(int));
*ptr_kn_col=(int*)realloc(*ptr_kn_col,k*sizeof(int));
*ptr_kn_val=(double*)realloc(*ptr_kn_val,k*sizeof(double));
/* and*/
*ptr_uk_row=(int*)realloc(*ptr_uk_row,j*sizeof(int));
*ptr_uk_col=(int*)realloc(*ptr_uk_col,i*sizeof(int));
*ptr_uk_val=(double*)realloc(*ptr_uk_val,i*sizeof(double));
}
另一种方式是:
evaluate_matrices(int **ptr_kn_row, int **ptr_kn_col, double **ptr_kn_val,
int **ptr_uk_row, int **ptr_uk_col, double **ptr_uk_val)
{
int *temp1,*temp2,*temp3,*temp4;
double *temp5,*temp6;
..........
temp1 =(int*)realloc(*ptr_kn_row, k*sizeof(*temp1));
if(temp1){*ptr_kn_row = temp1;}
temp2 =(int*)realloc(*ptr_kn_col, k*sizeof(*temp2));
if(temp2){*ptr_kn_col = temp2;}
temp5 =(double*) realloc(*ptr_kn_val, k*sizeof(*temp5));
if(temp5){*ptr_kn_val = temp5;}
......
temp3 = (int*)realloc(*ptr_uk_row, j*sizeof(*temp3));
if(temp3){*ptr_uk_row = temp3;}
temp4 = (int*)realloc(*ptr_uk_col, i*sizeof(*temp4));
if(temp4){*ptr_uk_col = temp4;}
temp6 = (double*)realloc(*ptr_uk_val, i*sizeof(*temp6));
if(temp6){*ptr_uk_val = temp6;}
}
答案 0 :(得分:1)
如果内存分配失败,第一个功能是轻微的灾难。它用NULL覆盖指向先前分配的空间的指针,从而泄漏内存。如果处理内存不足的策略是“立刻退出”,那么这几乎不重要。如果你打算释放内存,那么你就失去了它 - 运气不好。
因此,第二个功能更好。但是,您可能需要跟踪数组大小,因此我怀疑您在结构而不是原始指针方面做得更好,其中结构将包含大小信息以及指向已分配数据的指针。您必须能够以某种方式确定为每个阵列分配多少空间。
您还需要跟踪哪些数组(如果有)无法重新分配 - 这样您就不会尝试访问未分配的空间。
答案 1 :(得分:0)
我用我的小眼睛窥探:
*ptr_kn_val=(double*)realloc(*ptr_kn_val,k*sizeof(int));
^^^^^^^^^^^
我确定你的意思是sizeof(double)
,这只是一个复制粘贴错误。
在许多系统上,int
小于double
,因此,如果您的情况属实,则很可能是导致崩溃的原因。也就是说,在写入内存块结束后的某个时刻,未定义的行为。