在 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;
?
struct a 实例的内存如何,它会与 struct 区域平齐,还是在 struct a 内部有指针
平坦的。
数组成员是一个真正的数组,其大小struct
将为
2*sizeof(int) + 16 (+ padding)
如果我有会发生什么
struct a A,B A->b = B->b
编译错误。数组不可赋值。
它会与结构区域平齐,还是在结构a内部有指针,
它将是平坦的。即数组将物理地在你的结构内
如果我有 struct a A,B A->b = B->b 会发生什么
结构与此无关,这将导致编译错误,因为数组不能作为结构成员相互分配。使用循环或memcpy
.
但是,您可以分配整个结构,并且将复制数组
A = B; //the arrays inside will be copied.
使用 a for
,您不能分配给数组(数组名称不能用作左值)。
for (i = 0 ; i < 16; i++)
A->b[i] = B->b[i];
至于尺寸,sizeof
至少会返回2 * sizeof(int) + 16 * sizeof(char)
. 由于填充,您可能有更高的值。
要回答你的标题问题,你不能用你写的形式,但你可以在工会的帮助下:
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<.
这是因为结构中固定大小数组的平面布局(其他人已经提到过),并且因为联合(在本例中为匿名联合)允许您通过具有不同标识符的不同类型访问相同的内存位置。本质上,您只是在这里提前设置了一个类型转换。