我有一个程序,可以在链接列表中存储一系列大小为 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];
}
}
}
最佳答案
问题是函数advance
中的Link next;
对于函数来说是本地的。一旦离开该函数,即使您留下指向它的指针(使用 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;
}
一旦不再需要内存,请不要忘记释放
内存。
您似乎还在代码中调用了 advance( &chain, 5);
,但没有对应的函数定义。
关于C 二维数组在函数退出时更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23805774/