C 二维数组在函数退出时更改值

标签 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];
        }
    }
}

最佳答案

问题是函数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/

相关文章:

c++ - 如何检查某个内存地址是否可用于 C++?

c - 在 C 中以十六进制形式读取文件

c - 在 C 中给定的十六进制位置存储数字

c - 使用循环动态数组(2D)在 C 中 malloc 数组

python - 从查找表中插入数据

java - 调用方法时从数组返回一个值

c++ - C/C++ 中的 asc 和 chr 等价物

javascript - 循环遍历 Google App 脚本并设置多个不连续的值

c - [strcat&malloc&free],当我使用 strcat() 时,指针似乎不是 NULL,即使我故意将其设为 NULL(没有额外赋值)?

c++ - void* (*)() 和 void* 有什么区别?