将指针复制到结构时出现 memcpy 问题
memcpy issue when copying a pointer to a struct
我无法理解为什么 2 个板指针指向相同的内存位置,以下是我在 game.c 中的情况:
int game_state_transition(const struct state * s0, const struct move * m, struct state * s1) {
memcpy(s1, s0, sizeof(struct state));
memcpy(s1->board, s0->board, sizeof(struct move ***));
if (game_update(s1, m)){
printf("%p\n", s1->board);
printf("%p\n", s0->board);
game_print(s0);
s1->next = s0;
return 1;
}
return 0;
这是我的 game.h:
struct state {
struct player * current_player;
struct move *** board;
enum game_status status;
const struct state * next; };
我知道在第一次 memcpy 之后,2 个板指针指向内存中的相同位置,但我不明白第二次的行为。
感谢帮助
第一次memcpy调用使s1指向的和指向s0的一样。从这点s0->board和s1->board有相同的指针值
memcpy(s1, s0, sizeof(struct state));
示例:
before call:
s0->player = 0x000100
s0->move = 0x000200
s0->status = 1
s0->state = 0x000300
s1->player = 0x000400
s1->move = 0x000500
s1->status = 2
s1->state = 0x000600
after call:
s0->player = 0x000100
s0->move = 0x000200
s0->status = 1
s0->state = 0x000300
s1->player = 0x000100
s1->move = 0x000200
s1->status = 1
s1->state = 0x000300
对于第二个 memcpy,存在更多问题。
memcpy(s1->board, s0->board, sizeof(struct move ***));
首先,您发送指针,因此正确的术语应该是 sizeof(struct move **),但它会产生相同的大小,因为所有指针都具有相同的大小。
如果您打算制作一个新副本(为了保留以前的状态),您需要先分配内存。
我们在 C 编程中很少看到三颗星,但它确实发生了。这完全取决于所需的逻辑,以及调用堆栈中应该可以进行多少级别的更改。最常见的是 1 和 2(为您提供直接指针,以及对可以从外部点更改的指针的引用)
我无法理解为什么 2 个板指针指向相同的内存位置,以下是我在 game.c 中的情况:
int game_state_transition(const struct state * s0, const struct move * m, struct state * s1) {
memcpy(s1, s0, sizeof(struct state));
memcpy(s1->board, s0->board, sizeof(struct move ***));
if (game_update(s1, m)){
printf("%p\n", s1->board);
printf("%p\n", s0->board);
game_print(s0);
s1->next = s0;
return 1;
}
return 0;
这是我的 game.h:
struct state {
struct player * current_player;
struct move *** board;
enum game_status status;
const struct state * next; };
我知道在第一次 memcpy 之后,2 个板指针指向内存中的相同位置,但我不明白第二次的行为。
感谢帮助
第一次memcpy调用使s1指向的和指向s0的一样。从这点s0->board和s1->board有相同的指针值
memcpy(s1, s0, sizeof(struct state));
示例:
before call:
s0->player = 0x000100
s0->move = 0x000200
s0->status = 1
s0->state = 0x000300s1->player = 0x000400
s1->move = 0x000500
s1->status = 2
s1->state = 0x000600after call:
s0->player = 0x000100
s0->move = 0x000200
s0->status = 1
s0->state = 0x000300s1->player = 0x000100
s1->move = 0x000200
s1->status = 1
s1->state = 0x000300
对于第二个 memcpy,存在更多问题。
memcpy(s1->board, s0->board, sizeof(struct move ***));
首先,您发送指针,因此正确的术语应该是 sizeof(struct move **),但它会产生相同的大小,因为所有指针都具有相同的大小。
如果您打算制作一个新副本(为了保留以前的状态),您需要先分配内存。
我们在 C 编程中很少看到三颗星,但它确实发生了。这完全取决于所需的逻辑,以及调用堆栈中应该可以进行多少级别的更改。最常见的是 1 和 2(为您提供直接指针,以及对可以从外部点更改的指针的引用)