C 2D数组在函数退出时更改值

时间:2014-05-22 11:39:02

标签: c arrays pointers

我有一个程序可以在链表中存储一系列大小 4x4 的数组。返回扩展链表(void advance)的函数后,4x4数组的内容发生变化。为什么呢?

例如,在此实例中,在高级功能内部

chain.next.board = {{3,3,3,3},{3,3,3,3},{3,3,3,3},{3,3,3,3}} 

但是一旦函数返回

chain.next.board = {{3,3,3,3},{4200685,4210756,3,3},{3,3,3,3},{3,3,3,3}}

我是否打算以错误的方式传递链表?我应该使用malloc吗?我不太熟悉c。

中函数之间的传递指针
typedef struct Link{
    int board[4][4];
    struct Link* next;
} Link;

int main()
{
    int board[4][4] = {{3,3,3,3},{3,3,3,3},{3,3,3,3},{3,3,3,3}};
    Link chain;
    board_copy( board, chain.board);
    advance( &chain);
}

void advance( Link *this)
{
    Link next;
    board_copy( this->board, next.board);
    //Process_move( board); //Where board is changed to reflect move made
    this->next = &next;
}

void board_copy( int from[4][4], int to[4][4])
{
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            to[i][j] = from[i][j];
        }
    }
}

1 个答案:

答案 0 :(得分:1)

问题是函数Link next;中的advance是函数的本地函数。离开函数后,即使你指向它(使用this->next = &next;),也可能发生任何事情。

我会这样做:

void advance( Link *this)
{
    Link *next = malloc (sizeof *next);
    board_copy( this->board, next->board);
    //Process_move( board); //Where board is changed to reflect move made
    this->next = next;
}

一旦你不再需要记忆,就不要忘记free

您似乎也在代码中调用advance( &chain, 5);,但没有相应的函数定义。