将指针复制到结构时的memcpy问题

时间:2016-04-12 21:18:51

标签: c pointers struct memcpy

我无法理解为什么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个板指针指向内存中的相同位置,但我不明白第二个的行为。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

第一个memcpy调用使s1指向,与指向s0的内容相同。从这一点开始,s0-> board和s1->板具有相同的指针值

memcpy(s1, s0, sizeof(struct state));

示例:

  

致电前:
  s0-> player = 0x000100
  s0-> move = 0x000200
  s0-> status = 1
  s0-> state = 0x000300

     

s1-> player = 0x000400
  s1-> move = 0x000500
  s1-> status = 2
  s1-> state = 0x000600

     

致电后:
  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(给你直接指针,以及对可以从外部点改变的指针的引用)