3

我有以下代码,我想制作它,以便板现在具有 new_board 的值,反之亦然。由于它们都是指针,我想我可以交换它们指向的地址。当我在 print2() 中打印时,地址被适当地交换了。但是,当我在 print1() 中打印时,地址以某种方式交换回来,这对我来说没有任何意义。此外,如果我在 print2() 处打印出板上的值,它们也是正确的。

main(){
  char *new_board = (char *)malloc(sizeof(char) * rows * cols );
  char *board = (char *)malloc(sizeof(char) * rows * cols );
  update_board2(board, new_board, rows, cols);
  print1();
}

void update_board2(char *board, char *new_board, int rows, int cols){
  //do a bunch of stuff
  char *temp = board;
  board = new_board;
  new_board = temp;
  print2();
}
4

3 回答 3

16

如果要更改指针本身的值,则函数update_board2必须接受双指针。否则,指针会在函数内被复制,并且您只交换这些临时副本,而不是调用者传递的真实指针:

void update_board2(char **board, char **new_board){
  char *temp = *board;
  *board = *new_board;
  *new_board = temp;
  print2();
}
于 2012-11-06T07:55:21.330 回答
7

您需要进行以下更改:

update_board2(&board, &new_board, rows, cols);

void update_board2(char **board, char **new_board, int rows, int cols){
  //do a bunch of stuff
  char *temp = *board;
  *board = *new_board;
  *new_board = temp;
  print2();
}

在这种情况下,指针将正确交换。

于 2012-11-06T07:52:51.943 回答
2

你的主要问题也需要修复

IE

char * new_board = (char *)malloc(sizeof(char) * rows * cols );
char * board = (char *)malloc(sizeof(char) * rows * cols );

malloc 返回一个指针,而不是一个字符。

于 2012-11-06T07:58:53.620 回答