将struct的动态数组复制到另一个结构

时间:2016-01-08 15:53:25

标签: c++ arrays struct

我有一个像这样定义的结构:

struct Queries {

    uint64_t Id;
    uint64_t from;  
    uint32_t counter; // total queries
    char queries[];
};

我要做的是创建一个新结构" object"并将现有值中的值复制到此新对象。

我尝试了什么

void function(Queries* oldq){

    Queries* q = new Queries();

    // values are copied correctly
    q->Id = oldq->Id;
    q->from = oldq->from;
    q->counter = oldq->counter;

    // copy is not correct
    for (unsinged i = 0; i < oldq->counter; i++)
          q->queries[i] = oldq->queries[i];

}

1)我也尝试过:

q = oldq;

但这不起作用。

2)我认为我必须为查询数组分配counter * sizeof(char)空间,但由于结构的成员不是指针,我不知道如何做到这一点。

3 个答案:

答案 0 :(得分:2)

最简单的方法是使用std::string queries

然后您可以简单地编写Queries* q = new Queries(*oldq);并依赖编译器生成的构造函数:您可以删除所有复制代码。

答案 1 :(得分:2)

您正在处理C-style flexible array member。它不是有效的C ++代码,但它自C99起是有效的C(详见链接)。要使用此类结构,您需要分配sizeof(Queries) + counter个字节,其中数组字段将使用counter个字节部分。 (注意:如果您的数组字段不是char,则必须相应地相乘。)

现在,您不能像复制构造函数那样使用C ++功能,因为编译器不知道您的结构的大小。相反,你必须使用纯C方法:

Queries *cloneQueries(Queries *oldQ)
{
    size_t sizeQ = sizeof(Queries) + oldQ->counter;
    Queries *newQ = (Queries*)malloc(sizeQ);
    memcpy(newQ, oldQ, sizeQ);
    return newQ;
}

答案 2 :(得分:1)

您可以使用执行对象深层复制copy constructor来完成此操作。

这可以在代替function()而不是像这样定义复制构造函数时完成:

Queries(const Queries& q)
    : Id(q.Id), from(q.from), counter(q.counter)
{
    // allocate the new memory
    queries = new char[counter];

    // copy each element
    for (size_t i = 0; i < counter; ++i) {
        queries[i] = q.queries[i];
    }
}

然后在您的代码中,您可以使用以下行:

Queries *q = new Queries(*oldq); 

右侧的对象是通过复制构造创建的,即通​​过复制对象oldq

how operator new[] works