在C中更新2D数组

时间:2014-10-23 05:39:48

标签: c arrays multidimensional-array

我必须遍历2d数组的每个索引,找到邻居值是什么,然后根据它更新数组的索引。我的代码完成了所有这些,但是当我必须更新数组时,它会更新现有数组,因此下一个索引会产生不正确的输出。我尝试创建一个新数组,但是当我使用新数组时,没有任何更新,它保持不变。这就是我现在所拥有的。

void ch(int **b, int w, int h)
{
    int x,y,i,ct=0;
    int **up;
    up=malloc(sizeof(int *) * h);
    for(i = 0; i<h; i++){
        up[i]=malloc(sizeof(int)*w);
    }

    for (x=0;x<h;x++)
    {
        for(y=0;y<w;y++)
        {
            //...Computes Count Here(It Works)
            //UPDATE BOARD - Does not update the board
            if(b[x][y]==1 && ct<2)
            {
                up[x][y]=0;
            }
            else if(b[x][y]==1 && (ct==2 || ct==3))
            {
                up[x][y]=1;
            }
            else if(b[x][y]==1 && ct>3)
            {
                up[x][y]=0;
            }
            else if(b[x][y]==0 && ct==3)
            {
                up[x][y]=1;
            }
            ct=0;
        }
    }
    b=up;
}

我尝试通过对自身进行更改来更新2d数组b并更改数组,但它不是我要查找的输出。它会在每次迭代时更改输出,因此其他索引的输出会发生变化,但我希望它能让另一个数组跟踪输出,这样它就不会在每次迭代时更新b并给出正确的输出。我做错了什么不让我更新?解决这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

C按值传递参数

所以你可以这样做

int* pass(int *p){

//return new pointer; and later assign
}

或获取地址

void pass(int **p)
{
 *p=//new pointer

}

根据您的情况,最好在不分配新内容的情况下修改同一个数组

  

我无法修改相同的数组

您可以按照建议处理数组副本,然后从副本

更新以前的数组

或者按照我的建议返回复制的数组

值得一看:

C Faq question related on your issue

C Faq ways for allocating multidimensional array

答案 1 :(得分:0)

制作原始数组的副本并将其用作参考。然后,您可以直接更新原始数组。

void ch(int **b)
{
   int **up = malloc(sizeof(*int)*h);
   int i;
   for (i = 0; i < w; i++)
   {
       up[i] = malloc(sizeof(int) * w);
       memcpy(up[i], b[i], w * sizeof(int));
   }
   //
   if (up[x][y] == 1)
       b[x][y] = 0;
}
// free up

这可能比在

中具有额外的间接级别更容易维护
void ch(int ***b)
{
   int **up = *b;
   // do everything else as you intended

   // finalize with
   *b = up;
   // free up
}

同样在制作副本时,您可以通过将临时副本分配为线性数组来稍微提高性能

int *up = malloc(sizeof(int) * w * h);

if (up[y * w + x] == 0)
    b[y][x] = 1;

答案 2 :(得分:0)

在功能结束时,如果您有b=up;,则设置b指向新阵列,但这只会更改您的功能副本(b)而不是调用函数中的副本...所以调用者仍然可以看到原始数组。

但是,由于您使用指向数组的指针数组而不是实际的2D数组,因此可以替换b内容 (构成附加维度的数组的int *)......这将避免将所有新数组的数据复制到原始数组中。

所以而不是:

b=up;

尝试:

for(i = 0; i < h; i++) {
    free(b[i]);
    b[i] = up[i];
}
free(up);

这样,通过更改原始行数组中的指针,原始数组的每一行都会被新行中的相应行替换。

然而,这只是一个好主意,如果原始数组的行是动态分配的,就像新数组中的行一样,并且如果没有其他指针指向浮动的行(行数组之外)传递为b),之后可能仍然指向旧的记忆。