c - 将指针复制到结构时出现 memcpy 问题

标签 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;

这是我的游戏.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(为您提供直接指针,以及对可以从外部点更改的指针的引用)

关于c - 将指针复制到结构时出现 memcpy 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36584239/

相关文章:

c++ - 使用 PThreads 的全局列表访问 - 指针问题?

C++ - CORBA::LongSeq 到 long*

c - 如何在 C 中的结构中包含动态数组?

c - Linux 上的 UDP connect() 和 recv()

c - 68HC11 上使用 4 字节数字的斐波那契数列

c - 将来调用函数

C 没那么难 : void ( *( *f[] ) () ) ()

c - 一次调用多个函数的程序不断崩溃。 (C语言编程)

C++ : generic getter/setter for each single member of private struct

当 Content-Type 存在时,C libcurl 返回 null Content-Type。