>伙计们:)我有一个 2D 动态数组,我需要在每列中找到最大和最小的数字。我必须在我的数组中插入 2 行新行(最大和最小),但似乎我的realloc
无法正常工作。请告诉我我做错了什么,我应该如何继续。
int **in(int l,int c);
void out(int l, int c, int **a);
int max_colonne(int l, int c, int **a,int *max);
int minimal_colone(int l, int c, int **a,int *minimal);
int main()
{
int **x,*max,*minimal,l,c, i, j;
printf("nombre de lignes: ");
scanf("%d",&l);
printf("nombre de colonnes: ");
scanf("%d",&c);
x=in(l,c);
printf("La matrice cree.n");
out(l,c,x);
for(i=0;i<c;i++){
x[i]=(int *)realloc(x, (l+2)*sizeof(int)); }
free(x) ;
free(max) ;
}
int **in(int l,int c)
{
int **t,i,j;
t=(int **)malloc(l*sizeof(int *));
for(i=0;i<l;i++)
t[i]=(int *)malloc(c*sizeof(int));
for(i=0;i<l;i++)
for(j=0;j<c;j++)
{ printf("el[%d][%d]:",i,j);
scanf("%d",(t[i]+j));
}
return t;
}
void out(int l, int c, int **a)
{
int i,j;
for(i=0;i<l;i++)
{ for(j=0;j<c;j++)
printf("%3d",*(a[i]+j));
printf("n");
}
}
int max_colonne(int l, int c, int **a,int *max)
{
int i,j;
for(j=0;j<c;j++,max++)
{ *max=*a[j];
for(i=0;i<l;i++)
if(*(a[j]+i) > *max) *max=*(a[j]+i);
} return *max;
}
int minimal_colone(int l, int c, int **a,int *minimal)
{
int i,j;
for(j=0;j<c;j++,minimal++)
{ *minimal=*(a[0]+j);
for(i=0;i<c;i++)
if(*(a[i]+j) < *minimal) *minimal=*(a[i]+j);
} return *minimal;
}
您的realloc
不起作用,因为它是错误的,而不是
x[i]=(int *)realloc(x, (l+2)*sizeof(int));
它应该是
x[i] = realloc(x[i], (l + 2) * sizeof(int));
而且,您无需投射到int *
.
您应该始终检查 malloc
/realloc
/calloc
函数的返回值,失败时它们返回 NULL
,因此为了安全地使用 realloc
您应该使用临时变量,以防止丢失原始指针,因为如果您这样做,请执行以下操作
x[i] = realloc(x[i], newSize);
并且realloc
返回NULL
然后您丢失了对原始指针的引用x[i]
所以我会推荐
void *tmp;
tmp = realloc(x[i], newSize);
if (tmp == NULL)
handleMallocFailureErrorProbablyRetryOrExitTheProgram();
x[0] = tmp;
例如,free(x[i])
您可以在 handleMallocFailureErrorProbablyRetryOrExitTheProgram()
.