memcpy 问题 -> 尝试复制结构数组

memcpy issue -> trying to copy an array of struct

本文关键字:复制 结构 数组 问题 gt memcpy      更新时间:2023-10-16

我完全不知道为什么memcpy或memmove对我不起作用。

我正在尝试将结构数组(作业列表)复制到另一个相同结构 (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]

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

他们以你称呼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 .

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));