分段故障双指针重新分配

时间:2018-12-27 12:44:34

标签: c

我有一小段简单的代码,每次在第二条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; 
}

1 个答案:

答案 0 :(得分:0)

您不会重新分配自己的想法。

执行此操作时:

*x = (int**)realloc(*x,nNew*sizeof(int*));

for(int i = 0; i

由于x的类型为int **,因此*x的类型为int *。另外,*xx[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));
    }
}