在C typedef结构中创建可变大小的数组?

在C typedef结构中创建可变大小的数组?,c,struct,bitmap,typedef,C,Struct,Bitmap,Typedef,我想在创建结构时设置位的大小,这样我就可以创建不同大小的位图,但只写位[(长度*高度)-1]不起作用 typedef struct { uint8_t length; uint8_t height; uint8_t bits[ *how?* ]; } Bitmap; Bitmap BMP_1 = { 14, 14, { *Bitmap* } }; Bitmap BMP_2 = { 20, 20, { *Bitmap

我想在创建结构时设置位的大小,这样我就可以创建不同大小的位图,但只写
位[(长度*高度)-1]
不起作用

typedef struct {
    uint8_t length;
    uint8_t height;
    uint8_t bits[ *how?* ];
} Bitmap;

Bitmap BMP_1 = {
    14,
    14,
    {  *Bitmap*  }
};

Bitmap BMP_2 = {
    20,
    20,
    {  *Bitmap*  }
};

你不能那样做——对不起

C11标准

  • :结构或联合不应包含不完整或函数类型的成员(因此,结构不应包含自身实例,但可包含指向自身实例的指针),具有多个命名成员的结构的最后一个成员可能具有不完整的数组类型;这种结构(以及可能递归地包含这种结构的成员的任何并集)不应是结构的成员或数组的元素

  • :结构或联合的成员可以具有除可变修改类型以外的任何完整对象类型。123)

  • :作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,将忽略灵活数组成员。特别是,结构的大小就像省略了柔性数组成员一样,只是它可能具有比省略所暗示的更多的尾部填充。但是,当
    (或
    ->
    )运算符的左操作数是(指向)具有灵活数组成员的结构,而右操作数命名该成员时,其行为就好像该成员被替换为最长的数组(具有相同的元素类型)这不会使结构大于正在访问的对象;阵列的偏移量应保持柔性阵列构件的偏移量,即使这与替换阵列的偏移量不同。如果这个数组没有元素,它的行为就好像它有一个元素一样,但如果试图访问该元素或生成一个超过该元素的指针,则该行为是未定义的

123)结构或联合不能包含具有可变修改类型的成员,因为成员名称不是中定义的普通标识符

最接近的方法是通过定义
uint8_t位[]来创建一个FAM(灵活数组成员)作为结构的最后一个元素。现在,您必须使用动态内存分配(
malloc()
等)来创建以下类型的实例:

Bitmap *bm = malloc(sizeof(*bm) + length * height * sizeof(bm->bits[0]));

大小不能输入typedef。

您不能这样做-抱歉。最接近的方法是通过定义
uint8_t位[]来创建一个FAM(灵活数组成员)。现在您必须使用动态内存分配(
malloc()
等)来创建以下类型的实例:
Bitmap*bm=malloc(sizeof(*bm)+length*height*sizeof(bm->bits[0])。大小不能输入typedef。