在没有Malloc的情况下分配一个结构数组?

时间:2013-09-19 17:58:13

标签: c arrays struct

我有一个以这种方式定义的结构。

typedef struct COUNTRY {
    char Code[3];
    char Country[30];
    int Population;
    float Expectancy;
    struct Country *Pointer;
} COUNTRY;

我看过像这样分配的结构数组:

COUNTRY *countries = calloc(128, sizeof(COUNTRY));

或者可能是这样的:

COUNTRY *countries = malloc(128 * sizeof(COUNTRY));

但这是做什么的:

COUNTRY countries[128] = {};

因为在所有情况下我仍然可以写入每个条目的字段。第三种选择只是糟糕的形式吗?这对我来说似乎更好,因为你可以把这一行放在main()的的其余变量声明中。否则,你只能在main()或其他函数内部调用calloc()或malloc()。

我做错了吗?

5 个答案:

答案 0 :(得分:6)

此:

COUNTRY countries[128];

只需定义一个类型为“128个COUNTRY元素数组”的对象。

= {}是初始值设定项 - 但空的初始值设定项在C中是非法的(我认为gcc支持它们作为扩展名)。便携式替代方案是:

COUNTRY countries[128] = { 0 };

将所有元素的所有成员初始化为零(整数为0,字符为\0',浮点为0.0,指针为NULL,递归为子元素)。但是,由于您指定了数组中的元素数量(如128),因此初始化程序对数组对象的分配方式没有影响。

如果声明发生在函数定义中,则数组对象具有自动存储持续时间,这意味着当执行到达封闭块的末尾时它不再存在。这些对象通常分配在“堆栈”上。

如果它出现在任何函数定义之外(在文件范围,如果它有关键字static,那么它具有静态存储持续时间,这意味着它将继续存在于程序的整个执行过程中。

使用malloccalloc分配的对象具有分配的存储持续时间,这意味着它们将继续存在,直到通过调用{{1}显式释放它们为止}。这些对象通常分配在“堆”上。 (我忽略了free(),这使描述复杂化了一些。)

答案 1 :(得分:3)

前两个语句将在堆上分配结构数组,而最后一个语句将初始化堆栈上的结构数组。

这不是一个糟糕的形式,只是你想要将数据存储在堆栈中的问题(当你的变量超出范围时自动释放,堆栈的大小通常比堆小,所以你如果你在那里放置大数据结构,或者在堆上(数据的生命周期与范围无关,你需要手动释放你的内存)会溢出它。

  

对我来说似乎更好,因为你可以在main()之外添加其余的变量声明。

如果您需要具有程序生命周期的静态分配对象,请使用此方法,它没有任何问题。请注意,在这种特殊情况下,变量不会存储在堆栈中,而是存储在程序的.data段中(请查看此问题以获取更多详细信息:How are global variables stored?)。

答案 2 :(得分:0)

最后一种形式是'堆叠分配'或'静态分配'。与calloc一样,所有字段都将被清零。

在函数内部,它是'堆栈分配',当函数返回时,内存将消失。

在任何函数之外,在文件范围内,它是静态分配的,并且在main()启动之前分配了一个全局内存。

答案 3 :(得分:0)

当您在编译时不知道需要多少时,使用

malloc / calloc。例如,在链表中,您需要动态分配/取消分配节点。使用数组时,您可以确切地知道编译时需要多少数。

还有不同之处在于 从哪里取出内存。如果在函数中声明数组,则将从stack中获取内存。在malloc / calloc的情况下,内存留在heap

答案 4 :(得分:0)

= {};

是GNU C扩展,与以下内容相同:

= {0};