我有一个程序可以在链表中存储一系列大小 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];
}
}
}
答案 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);
,但没有相应的函数定义。