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

How can I concatenate two structs type variables in c++?

本文关键字:两个 结构体 类型变量 c++ 连接      更新时间:2023-10-16

我一直在尝试一段时间连接一些结构(我定义)类型变量到一个更大的。我得到的基本上是这样的:

我有一个struct和两个struct**类型的变量。我声明了第三个结构体C我想把a和B连接到C中。我尝试的是这样的东西(我现在没有代码,所以我会写一些非常类似的东西,其中一些名称更改了,因为我不记得它们。

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

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

我像这样为C分配内存。

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

我像这样用内存移动A和B

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

很明显,我所做的是不正确的,因为似乎所有这些C只包含A。我很确定问题来自"**",我不能很好地处理指针到指针。有人能就我的问题给我一些建议吗?我也不想使用句柄,我必须使用memcpy/memmove。


[update from comment:]

您已经在某处定义了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};

[Best for C]

就用数组。

假设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 */
}

首先,你的代码有一个bug:

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没有原语,老兄,只要单独分配每个字段就行了。真的有那么多工作吗?我想,如果你期望这些场有很大的变化,推广它是有意义的。但是这种"聪明的代码"恰恰是那种会在以后给你带来麻烦的东西。