【问题标题】:Dynamically allocated array of structures in CC中动态分配的结构数组
【发布时间】:2014-08-22 17:07:56
【问题描述】:

我只是想知道以下是否有效。我有一个结构 称为foo,其定义如下:

struct foo {
    char name[255];
    int amount;
};

在运行时,我需要创建一个由上述结构组成的数组,其大小取决于我从文件输入中接收到的值。假设这个大小是k。下面的代码会适当地分配一个动态大小的结构数组吗?

struct foo *fooarray;
fooarray = malloc(k * sizeof(struct foo));

编辑:如果我想访问这些数组中结构的成员,我会使用 fooarray[someindex].member 格式吗?

【问题讨论】:

  • 请注意,动态分配的数组与可变长度数组或 VLA 非常不同。你应该知道这些不是VLA,这样你就不会混淆其他人,或者被其他人混淆。
  • 好的,感谢您解决这个问题。术语上的差异以前对我来说并不明显,但现在是。

标签: c struct dynamic-arrays variable-length-array


【解决方案1】:

会的。
失败时将返回 0。
而且你必须释放 malloc 完成后返回的内存

您可以访问第一个成员:

fooarray[0].name
fooarray[0].amount

第二个为:

fooarray[1].name
fooarray[1].amount

等等。

【讨论】:

    【解决方案2】:

    这将起作用(并且您的访问是正确的)。此外,您可以使用以下成语防止尺寸错误:

    fooarray = malloc(k * sizeof *fooarray);
    

    考虑使用calloc,如果您的项目以零金额和空白字符串而不是垃圾开头会很好。

    但是,这不是 VLA。这是一个动态分配的数组。 VLA 将是:

    struct foo fooarray[k];
    

    【讨论】:

      【解决方案3】:

      在这种方法中可以使用另一种不同的符号:

      struct foo {
          char name[255];
          int amount;
      };
      
      int main (void)
      {
       struct foo *fooarray;
       struct foo *fooptr[5];
      
       unsigned int i = 0;
      
       for (i = 0;  i < 5; i++)
        fooptr[i] = malloc(1* sizeof(struct foo));
      
       fooptr[2]->name[3] = 'A';
       printf ("\nfooptr[2]->name[3]=%c\n",fooptr[2]->name[3]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 2019-07-19
        相关资源
        最近更新 更多