【问题标题】:memcpy issue -> trying to copy an array of structmemcpy 问题-> 尝试复制结构数组
【发布时间】:2026-02-10 18:50:01
【问题描述】:

我完全不知道为什么 memcpy 或 memmove 不适合我。

我正在尝试将一个结构 (joblist) 数组复制到另一个相同结构 (Q) 的数组以用于数据操作,同时保持我的原始数组不变。

我花了很多时间在 SO 和谷歌上解决这个问题,但我不知道为什么它不起作用。

    Q = new AdjacencyList[numjobs + 1]; //create a queue
    // Q = joblist;
    memmove(&Q, &joblist, sizeof(AdjacencyList) );
    Q[0].jobnum = 30;

我试图让 Q = joblist,但是当我将一个值更改为一个时,它在两个都更改了。

    struct AdjacencyList  {
    NodeType state; // what is present state of job? 
    NodePath path; // is job part of critical path?
    int jobnum;
    int edges;     
    int tocount;
    int fromcount;          
    int to[50];      
    int from[50]; 
    };
    AdjacencyList *joblist;
    AdjacencyList *Q;

这是我创建的结构。

*** Error in `p5.out': corrupted double-linked list: 0x0989e8c0 ***
======= Backtrace: =========
/lib/libc.so.6[0x47975143]
/lib/libc.so.6[0x4797b984]
/lib/libc.so.6[0x4797cd28]
/lib/libstdc++.so.6(_ZdlPv+0x20)[0x47d8d9e0]
/lib/libstdc++.so.6(_ZdaPv+0x1c)[0x47d8da3c]

任何帮助将不胜感激。谢谢。

订阅

【问题讨论】:

  • 如果 joblistQstd::vector<AdjacencyList>,您就不必纠结于 newmemcpy
  • 我会使用向量,但这是大学数据结构作业,我们不允许使用 STL 中的任何内容。感谢您的评论

标签: c++ arrays struct memcpy memmove


【解决方案1】:

你打电话给memmove(dst, src, sizes)。是不正确的。应该是

memmove(Q, joblist, sizeof(AdjacencyList) * (numjobs + 1));

更新:

就像它的名字一样,memmove 在内存上运行。它只是将sizes字节数据从src复制到dst

如果你想复制一个包含n个对象的数组到Q,你必须告诉函数你要复制的数据的总大小,即size of each objects * number of objects。我不知道你需要复制多少个对象,numjobs + 1 只是一个例子。如果你想复制numjobs,它应该是sizeof(AdjacencyList) * numjobs

【讨论】:

  • 非常感谢。我已经把这根头发拔掉了。你能告诉我为什么 * (numjobs + 1) 吗?
【解决方案2】:
memmove(&Q, &joblist, sizeof(AdjacencyList) );

错误并导致未定义的行为。它将sizeof(AdjacencyList)字节从joblist的地址复制到Q的地址。

你需要用到的是:

memmove(Q, joblist, sizeof(AdjacencyList) );

将一个对象从joblist 复制到Q。如果要复制numjobs + 1对象,需要使用:

memmove(Q, joblist, sizeof(AdjacencyList)*(numjobs + 1));

【讨论】:

  • 感谢您的回复。你们都很乐于助人。我现在明白为什么 * (numjobs + 1).创造一个有意义的世界。