【问题标题】:How to create struct with dynamically sized array in it in C如何在C中创建具有动态大小数组的结构
【发布时间】:2019-03-19 16:29:24
【问题描述】:

鉴于我有这样的结构 something

struct arr {
  int len;
  void *item[]; // still playing with this
};

typedef struct arr my_array;

我想知道你是如何初始化它的。

my_array foo = { 0, 1000 }; // 1000 spaces reserved.
// or perhaps...
my_array foo = { 0, [1000] };

因为当你有一个常规数组时,你可以像这样指定大小:

int anarray[1000];

所以我想你可以这样做来初始化上面数组结构中的指针值。

也许

foo->item[1000];

我不知道。想知道这样的事情是否可能。

【问题讨论】:

  • 不在问题上,但可能与标题相关:通常使用{size_t len; type_x item[1];},然后创建/扩展数组(GNU GCC 允许您使用item[0],这可以简化一些计算。跨度>
  • alloc/realloc 会给它一个大小
  • @GiacomoCatenazzi “通常”?不,不是这些天。这是您在 C89 中必须这样做的方式,但 C99 引入了 Lance 正在使用的功能,称为 flexible array members
  • @Gilles,是的,灵活数组是新方法。但我的观点是不要使用第二次重定向。

标签: c arrays struct


【解决方案1】:

灵活的数组成员只有在动态分配结构时才真正有用。如果结构是静态或自动分配的(即在堆栈上),则分配的内存量为sizeof(struct arr),它是用item 中的0 个成员计算的。没有语法可以定义类型为具有灵活数组成员的结构的变量并指定该数组的大小。

所以如果你在堆栈上分配这个结构,那就是它的全部:

struct my_array foo = { 0 };

要将元素放入灵活数组中,需要动态分配内存。

struct my_array *foo = malloc(sizeof(*foo) + 1000 * sizeof(foo->item[0]));

【讨论】:

    【解决方案2】:

    如果您希望数组有任何空间分配给它,则需要动态分配具有灵活数组成员的struct 类型:

    struct arr *foo = malloc( sizeof *foo + (sizeof foo->item[0] * 1000) );
    if ( foo )
    {
      foo->len = 1000;
      for ( int i = 0; i < foo->len; i++ )
        foo->item[i] = some_value();
    }
    ...
    free( foo );
    

    【讨论】:

    • 我喜欢sizeof 的地方在于它允许您编写令人难以置信的表达式。
    【解决方案3】:

    假设您希望 item 灵活数组成员包含 m 指针,

    struct arr *p = malloc(sizeof (struct arr) + sizeof ((void*)[m])); 
    

    这将像您将结构定义为

    struct arr {
      int len;
      void *item[m];
    };
    

    声明它不完整,它允许您在运行时选择数组的大小。

    6.7.2.1 Structure and union specifiers,p16:

    作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。 ....... 如果这个数组没有元素,它的行为就好像它有一个元素,但是如果尝试访问该元素或生成一个越过它的指针,则行为是不确定的。

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 2021-11-15
      • 2012-11-27
      • 1970-01-01
      • 2019-06-27
      • 2020-01-23
      • 2014-05-23
      • 1970-01-01
      相关资源
      最近更新 更多