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

あなたのメインも修正する必要があります

すなわち

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

mallocは、文字ではなくポインターを返します。

于 2012-11-06T07:58:53.620 に答える