我有一小段简单的代码,每次在第二条if语句中通过realloc for循环时,都会不断给我带来分段错误。
*x = (int**)realloc(*x,nNew*sizeof(int*));
for(int i=0;i<n;i++)
x[i] = (int*) realloc(x[i],nNew*sizeof(int)); // seg fault
我认为内存分配已正确完成(显然不是),但是我找不到错误。在第一个if语句(我在其中取消分配内存)中,它可以正常工作。
很抱歉格式错误。
void update(int **x,int n,int nNew)
{
int temp;
if(n>nNew)
{
*x = (int **) realloc(*x,nNew*sizeof(int*));
for(int i=0;i<n;i++)
*(x+i) =(int *) realloc(x[i],nNew*sizeof(int));
printf("temp %d",x[nNew-1][nNew-1]);
}
else if(n<nNew)
{
temp = x[n-1][n-1];
*x = (int**)realloc(*x,nNew*sizeof(int*));
for(int i=0;i<n;i++)
x[i] = (int*) realloc(x[i],nNew*sizeof(int)); // seg fault
printf("temp %d",**temp);
for(int i=n;i<(nNew);i++)
{
for(int j=n;j<(nNew);j++)
x[i][j] = temp;
}
}
}
int main()
{
int nNew = 9;
int n = 8;
int **x = (int **) malloc(n*sizeof(int*));
for (int i=0; i<n; i++)
x[i] = (int *)malloc(n * sizeof(int));
int count=0 ;
for(int i=0;i<n;i++)
{
count ++;
for(int j=0;j<n;j++)
x[i][j] = count;
}
update(x,n,nNew);
for(int i=0;i<nNew;i++)
free(x[i]);
free(x);
return 0;
}
答案 0 :(得分:0)
您不会重新分配自己的想法。
执行此操作时:
*x = (int**)realloc(*x,nNew*sizeof(int*));
for(int i = 0; i
由于x
的类型为int **
,因此*x
的类型为int *
。另外,*x
与x[0]
相同。因此,您不是在第一行而是在int
的第一数组中重新分配指针数组。您需要在原始指针上调用realloc
,并且您需要传递该指针的地址,以便更改在调用程序中可见。
然后要重新分配各个数组,您需要在原始realloc
上调用n
来增大或缩小它们,然后free
多余的行或{{ 1}}新添加的行。在不断增长的情况下,您想malloc
指针数组fisrt,在不断缩小的情况下,您要最后这样做。
因此,在进行了这些更改之后,您的realloc
函数应如下所示:
update
您这样称呼它:
void update(int ***x, int n, int nNew)
{
if(n>nNew) {
// shrink each row to be kept
for(int i=0;i<nNew;i++)
(*x)[i] = realloc((*x)[i],nNew*sizeof(int));
// free the extra rows
for(int i=nNew;i<n;i++)
free((*x)[i]);
// shrink the list of rows
*x = realloc(*x,nNew*sizeof(int*));
} else if(n<nNew) {
// grow the list of rows
*x = realloc(*x,nNew*sizeof(int*));
// grow the existing rows
for(int i=0;i<n;i++)
(*x)[i] = realloc((*x)[i],nNew*sizeof(int));
// create the new rows
for(int i=n;i<nNew;i++)
(*x)[i] = malloc(nNew*sizeof(int));
}
}