2016-04-12 35 views
1

当是我在我的game.c情况:memcpy的问题复制的指针,我无法理解为什么2点板的指针指向同一个内存位置,下面的一个结构

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点板的指针指向同一个内存位置,但我不明白的第二个行为。

感谢您的帮助

+3

啊,一个三星级的程序员。 – EOF

+1

'sizeof(struct move ***)'是错误的大小。然而你只需将's1-> board'设置为's0-> board'(带有第一个memcpy),所以第二个memcpy会导致未定义的行为,因为它具有相同的源和目标。你还没有说你想做什么,但我想你正在试图制作一份电路板的副本,而不是让一个电路板上有两个指针指向它? (如果是这样,请更新您的问题以包含此信息,并显示您如何分配董事会首先)。 –

+0

你也没有说明你从第二个memcpy观察到的行为(也不是你期望它做什么)。 –

回答

1

第一的memcpy调用使什么S1点,是一样的道出了什么S0。从这点S0->板和S1->板具有相同的指针值

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

例如:

呼叫之前:
S0->玩家= 0x000100
S0->举动= 0x000200
S0->状态= 1
S0->状态= 0x000300

S1->玩家= 0x000400
S1->举动= 0x000500
S1->状态= 2
S1->状态= 0x000600

呼叫之后:
S0->玩家= 0x000100
S0->举动= 0x000200
S0- >状态= 1
S0->状态= 0x000300

S1->玩家= 0x000100
S1->举动= 0x000200
S1->状态= 1
s1-> state = 0x000300

对于第二个memcpy还有更多问题。

memcpy(s1->board, s0->board, sizeof(struct move ***)); 
首先

,你送的指针,所以,正确的说法是的sizeof(结构移动**),但它会产生相同的大小,因为所有的指针都具有相同的尺寸。

如果您打算制作一个新副本(为了保留之前的状态),您需要先分配内存。

在C编程中我们经常看不到三颗星,但它确实发生了。这一切都取决于所需的逻辑,以及在调用堆栈中应该可以进行多少级别的更改。最常见的是1和2(给你直接指针,并指向一个可以从外部点改变的指针)

相关问题