4

在 C 中,我有

struct a {
    int a;
    char b[16];
    int c;
};

的实例的内存如何struct a,它会与结构区域平齐,还是内部struct a有指针,例如,结构大小是 4+16+4 还是 4+4+4 ?

如果我有会发生什么

struct a A,B;
A->b = B->b;

?

4

4 回答 4

5

struct a 实例的内存如何,它会与 struct 区域平齐,还是在 struct a 内部有指针

平坦的。

数组成员是一个真正的数组,其大小struct将为

2*sizeof(int) + 16 (+ padding)

如果我有会发生什么struct a A,B A->b = B->b

编译错误。数组不可赋值。

于 2013-02-14T12:38:17.567 回答
4

它会与结构区域平齐,还是在结构a内部有指针,

它将是平坦的。即数组将物理地在你的结构内

如果我有 struct a A,B A->b = B->b 会发生什么

结构与此无关,这将导致编译错误,因为数组不能作为结构成员相互分配。使用循环或memcpy.

但是,您可以分配整个结构,并且将复制数组

A = B; //the arrays inside will be copied.
于 2013-02-14T12:38:17.600 回答
2

使用 a for,您不能分配给数组(数组名称不能用作左值)。

for (i = 0 ; i < 16; i++)
    A->b[i] = B->b[i];

至于尺寸,sizeof至少会返回2 * sizeof(int) + 16 * sizeof(char). 由于填充,您可能有更高的值。

于 2013-02-14T12:38:10.630 回答
0

要回答你的标题问题,你不能用你写的形式,但你可以在工会的帮助下:

struct A {
    int a;
    union {
        char b[16];
        struct { char b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15; }
    };
    int c;
};

现在您可以像这样分配和使用它:

const A test = {
    .a = 1,
    .b0 = 'a', .b1 = 'b', .b2 = 'c', .b3 = 'd', .b4 = 'e', .b5 = 'f', .b6 = 'g', .b7 = 'h', .b8 = 'i', .b9 = 'j', .b10 = 'k', .b11 ='l', .b12 ='m', .b13 ='n', .b14 ='o', .b15 = 'p',
    .c = 255
};

printf("The final b is >%c<.\n", test.b[15]); // prints: The final b is >p<.

这是因为结构中固定大小数组的平面布局(其他人已经提到过),并且因为联合(在本例中为匿名联合允许您通过具有不同标识符的不同类型访问相同的内存位置。本质上,您只是在这里提前设置了一个类型转换。

于 2014-06-29T04:04:23.270 回答