如何分配固定大小的数组?

时间:2013-02-14 12:36:28

标签: c struct

在C中,我有

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;

4 个答案:

答案 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允许您访问具有不同标识符的不同类型的相同内存位置。从本质上讲,你只是提前在这里设置一个类型转换。