将结构A分配给B,其中A的元素是B的子集

时间:2011-11-08 08:37:59

标签: c struct

据我所知,分配数组是一个内存复制操作,这会起作用吗?

struct x{
    int i;
    int j;
} A[5];

struct y{
    int i;
    int j;
    struct y * next;
} B[5];

然后我可以这样做:

B[0] = A[0];

并期望i和j复制为index [0]?

编辑:我真正想知道的是如何在C中完成这项工作。

4 个答案:

答案 0 :(得分:3)

我的建议是将struct x嵌入struct y,如下:

struct x{
    int i;
    int j;
} A[5];

struct y{
    struct x x;
    struct y * next;
} B[5];

这样,它很容易分配,并且两个结构的第一个sizeof(struct x)字节的内存布局保证相同,即使在C89中也是如此。

您现在可以

B[0].x = A[0];

由于保证struct x出现在内存中struct y的第一个字节,您仍然可以

memcpy(&B[0], &A[0], sizeof A[0]);

您可以在http://codepad.org/2rCJA0cx

播放此布局

答案 1 :(得分:2)

不,那行代码不会编译。

请参阅http://codepad.org/6g3c9Ctz

您可以使用memcpy使其正常工作。见http://codepad.org/1I9Z3npC

#include <string.h>
#include <stdio.h>

struct x{
    int i;
    int j;
} A[5];

struct y{
    int i;
    int j;
    struct y * next;
} B[5];

int main() {
    A[0].i = 5;
    A[0].j = 7;
    memcpy(&B[0], &A[0], sizeof A[0]);
    printf("%d %d\n", B[0].i, B[0].j);
    return 0;
}

答案 2 :(得分:0)

不,你不能,因为struct x和struct y不是兼容的类型。

答案 3 :(得分:-1)

你可以使用演员:

(struct x)(B[0]) = A[0];
相关问题