在C语言中动态分配结构体数组

3

我想知道以下内容是否有效。我有一个名为foo的结构体,定义如下:

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

在运行时,我需要创建一个以上结构体的数组,其大小取决于我从文件输入中接收到的值。假设这个大小为k。以下代码是否适当地分配了一个动态大小的结构体数组?
struct foo *fooarray;
fooarray = malloc(k * sizeof(struct foo));

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


3
请注意,动态分配的数组与可变长度数组(VLA)非常不同。您应该了解这些不是VLA,以便您不会让其他人感到困惑,也不会被其他人所困惑。 - Jonathan Leffler
好的,谢谢您解释清楚。在此之前,术语上的差异对我来说不是很明显,但现在已经清楚了。 - user3059347
3个回答

4

这个方法可行(并且您的访问方式是正确的)。此外,您可以通过使用惯用语避免大小错误:

fooarray = malloc(k * sizeof *fooarray);

如果您希望项目的初始值为零并且字符串为空白而不是垃圾,请考虑使用calloc

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

struct foo fooarray[k];

1
是的,它会返回0来表示失败。当你完成使用时,你需要释放由malloc返回的内存。
你可以访问第一个成员:
fooarray[0].name
fooarray[0].amount

第二个如下所示:
fooarray[1].name
fooarray[1].amount

etc..


-1

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

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]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接