如何在c ++中连接两个结构类型变量?

时间:2015-08-31 16:28:20

标签: c++ c pointers struct memcpy

我一直试图将一些struct(我定义的)类型变量连接成一个更大的变量。我得到的基本上是这样的:

我有一个结构和两个类型为struct **的变量。 我声明第三个结构C,我想将A和B连接成C. 我尝试过的是这样的事情(我现在没有代码在我面前,所以我会写一些非常类似的东西,因为我不记得它们会改变一些名字。

struct** A, B;
struct** C;

(我知道A和B,因为我通过调用另一个函数来接收它们)

我像这样为C分配内存。

C = (struct**)malloc(sizeof(A)+sizeof(B));

我用这样的memcpy移动A和B.

memcpy(&C, &A, sizeof(A));
memcpy(&C + sizeof(A), &C, sizeof(B));
很明显,我所做的并不正确,因为看起来所有这些C只包含A. 我很确定问题来自" **",我无法处理好指针的指针。 有人可以就我的问题给我一些建议吗? 我也不想使用Handles,我必须使用memcpy / memmove。

[评论更新:]

我的结构都是相同的类型。

3 个答案:

答案 0 :(得分:3)

您已经在某处定义了struct A a;struct B b;。 要将它们连接成struct C,请执行以下操作:

struct A a;
struct B b;

struct C{
    struct A a;
    struct B b;
};

struct C c;
c.a = a;
c.b = b;

无需指针或memcpy

修改:由于ab属于同一类型,因此您可以稍微缩短一下:

struct Something a, b;

struct C{
    struct Something[2];
};

struct C c;
c[0] = a;
c[1] = b;

在C ++中你会做这样的事情:

using C = std::array<Something, 2>;
C c{a, b};

答案 1 :(得分:1)

只需使用数组。

假设struct A在堆栈上定义了一个数组

struct A a1 = {...}; /* some initialisation here */
struct A a2 = {...}; /* more initialisation here */

struct A a[2];
a[0] = a1;
a[1] = a2;

或动态分配:

struct A * pa = malloc(2 * sizeof *pa);
if (NULL != pa)
{
  pa[0] = a1;
  pa[1] = a2;

  /* use pa */

  free(pa);
}
else
{
  /* handle malloc error */
}

答案 2 :(得分:0)

好吧,首先,您的代码有一个错误:

memcpy(&C, &A, sizeof(A));
memcpy(&C + sizeof(A), &C, sizeof(B));

应该是

memcpy(&C, &A, sizeof(A));
memcpy(&C + sizeof(A), &B, sizeof(B));

您将C复制回C而不是B.

其次,如果你发现自己玩这样的指针,你可能会遇到一个设计问题。如果你真的想要将两个结构合并在一起,为什么结构C只包含结构A和B?

如果你真的希望struct C没有任何bot原语,那么,只需要分别分配每个字段。真的那么多工作吗?如果您希望这些字段发生很大变化,我想将它概括为一般是有道理的。但是这种“聪明的代码”就是一些确切的东西,它会让你在后来的屁股中咬你。

相关问题