C中的结构定义

Structure definition in C

我想按以下方式定义一个结构体:

typedef struct Info_s
{
 uint8   Size;
 uint8   Address;
 uint8   Pattern[Size];    
}Info_t;

正如您所注意到的,数组 Pattern 的大小是 "Size",它首先在同一结构中声明。

对吗?

你不能那样做。那是违反规则的。编译代码你就知道了

而是保留一个uint8*,然后根据Size.

的值为其分配内存(使用mallocrealloc等)

现在,如果您增加或减少值 Size,请重新分配您的内存。

是的,您必须在使用完后释放动态分配的内存。

选择

uint8*   Pattern;

并在 Size 已知后使用 malloc 分配其大小。

声明为结构域的数组必须有一个整数常量表达式作为它的大小或者是一个灵活数组成员没有大小(uint8 Pattern[];)。您的变体两者都不是。

如果你的数组大小是运行时间值,你有两个选择

  1. 灵活的数组成员 uint8 Pattern[];,这将导致 "flat" 结构。必须使用 malloc 手动分配适当的内存量以容纳具有所需长度数组的整个结构。

  2. 指针成员uint8 *Pattern;,在这种情况下你的结构将变成两级。结构本身的内存和数组的内存一般会变成两个独立分配的内存块。

灵活的数组成员通常是一个更好的主意(并且符合您明显的原始意图),除非您有一些其他要求会阻止该方法。

只需删除 Pattern 声明中的数组大小 Size,您将获得一个有效的具有灵活数组成员的结构声明。:)

typedef struct Info_s
{
 uint8   Size;
 uint8   Address;
 uint8   Pattern[];    
}Info_t;

如果你想为结构体动态分配内存,你可以通过以下方式进行:

struct Info_s
{
 uint8   Address;
 uint8   Pattern[Size];    
};

int main()
{
       struct Info_s *no;
       int i, noOfRecords;
       printf("Enter no: ");
       scanf("%d", &noOfRecords);

       no=(struct Info_s*) malloc (noOfRecords * sizeof(struct course));

       for(i=0;i<noOfRecords;++i)
       {
          scanf(...);
       }
     .
     .
     .
     return 0;
}

您也可以参考https://www.programiz.com/c-programming/examples/structure-dynamic-memory-allocation了解更多信息。