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