我一直试图将一些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。
[评论更新:]
我的结构都是相同的类型。
答案 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
。
修改:由于a
和b
属于同一类型,因此您可以稍微缩短一下:
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原语,那么,只需要分别分配每个字段。真的那么多工作吗?如果您希望这些字段发生很大变化,我想将它概括为一般是有道理的。但是这种“聪明的代码”就是一些确切的东西,它会让你在后来的屁股中咬你。