【问题标题】:memcpy issue when copying a pointer to a struct将指针复制到结构时出现 memcpy 问题
【发布时间】:2016-04-12 21:18:51
【问题描述】:

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

感谢您的帮助

【问题讨论】:

  • 啊,三星级程序员。
  • sizeof(struct move ***) 是错误的大小。但是,您只需将 s1->board 设置为等于 s0->board(使用第一个 memcpy),因此第二个 memcpy 会导致未定义的行为,因为它具有相同的源和目标。您还没有说您要做什么,但我想您是在尝试制作电路板的副本,而不是让一个电路板带有两个指向它的指针? (如果是这样,请更新您的问题以包含此信息,并首先显示您如何分配董事会)。
  • 你也没有说你从第二个 memcpy 中观察到了什么行为(也没有说你期望它做什么)。
  • 为什么不会它们指向同一个位置?您的程序将 s0 复制到 s1。您似乎很惊讶在将 s0 复制到 s1 之后,s0 和 s1 包含相同的值......即使这是复制某些内容的全部意义,不是吗? (“值”包括指针的值)。

标签: c pointers struct memcpy


【解决方案1】:

第一个 memcpy 调用使 s1 指向的内容与指向 s0 的内容相同。至此 s0->board 和 s1->board 具有相同的指针值

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->状态 = 0x000300

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

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

首先,您发送指针,因此正确的术语是 sizeof(struct move **),但它会产生相同的大小,因为所有指针都具有相同的大小。

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

在 C 编程中我们很少看到三颗星,但确实会发生。这完全取决于所需的逻辑,以及调用堆栈中应该有多少级别的更改。最常见的是 1 和 2(为您提供直接指针,以及对可以从外部点更改的指针的引用)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多