【问题标题】:Structure definition in CC中的结构定义
【发布时间】:2018-06-19 19:33:04
【问题描述】:

我想通过以下方式定义结构:

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

您可以注意到数组 Pattern 的大小是“Size”,它首先在同一结构中声明。

对吗?

【问题讨论】:

  • 没有。它不是。显然Size 在定义时没有任何价值。
  • 编译器可以告诉你它是否正确。比您发布此问题要快。
  • 那么有什么解决办法吗?
  • 动态分配是解决方案。

标签: c arrays structure definition


【解决方案1】:

声明为结构字段的数组必须有一个整数常量表达式作为其大小,或者是一个没有大小的灵活数组成员 (uint8 Pattern[];)。你的变种都不是。

如果您的情况下的数组大小是运行时值,您有两种选择

  1. 灵活的数组成员uint8 Pattern[];,这将产生一个“扁平”结构。必须手动使用malloc 手动分配用于容纳具有所需长度数组的整个结构的适当内存量。

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

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

【讨论】:

    【解决方案2】:

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

    而是保留一个uint8*,然后根据Size 的值为其分配内存(使用mallocrealloc 等)。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        一起去

        uint8*   Pattern;
        

        一旦知道Size,就使用malloc分配它的大小。

        【讨论】:

          【解决方案5】:

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

          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了解更多信息。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-20
            • 1970-01-01
            • 1970-01-01
            • 2011-10-11
            • 2011-01-11
            • 2021-12-07
            • 1970-01-01
            • 2010-10-05
            相关资源
            最近更新 更多