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

chr*_*inx 5 c arrays struct

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

typedef struct COUNTRY {
    char Code[3];
    char Country[30];
    int Population;
    float Expectancy;
    struct Country *Pointer;
} COUNTRY;
Run Code Online (Sandbox Code Playgroud)

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

COUNTRY *countries = calloc(128, sizeof(COUNTRY));
Run Code Online (Sandbox Code Playgroud)

或者像这样:

COUNTRY *countries = malloc(128 * sizeof(COUNTRY));
Run Code Online (Sandbox Code Playgroud)

但这是做什么的:

COUNTRY countries[128] = {};
Run Code Online (Sandbox Code Playgroud)

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

难道我做错了什么?

Kei*_*son 6

这个:

COUNTRY countries[128];
Run Code Online (Sandbox Code Playgroud)

简单地定义一个类型为"128个COUNTRY元素的数组"的对象.

= {}是一个初始化程序 - 但空的初始化程序在C中是非法的(我认为gcc支持它们作为扩展).便携式替代方案是:

COUNTRY countries[128] = { 0 };
Run Code Online (Sandbox Code Playgroud)

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

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

如果它出现在任何函数定义之外(在文件范围内)或者如果它具有关键字static,那么它具有静态存储持续时间,这意味着它对于程序的整个执行仍然存在.

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