我有一个以这种方式定义的结构。
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()。
我做错了什么吗?
最佳答案
这个:
COUNTRY countries[128];
简单地定义了一个类型为“128个COUNTRY
元素的数组”的对象。
= {}
是一个初始化器——但空的初始化器在 C 中是非法的(我认为 gcc 支持它们作为扩展)。一个便携的替代方案是:
COUNTRY countries[128] = { 0 };
将所有元素的所有成员初始化为零(0
用于整数,\0'
用于字符,0.0
用于 float , NULL
用于指针,递归用于子元素)。但是由于您指定了数组中元素的数量(如 128
),因此初始化程序对数组对象的分配方式没有影响。
如果声明发生在函数定义内,则数组对象具有自动存储期限,这意味着当执行到封闭 block 的末尾时它不再存在。此类对象通常分配在“堆栈”上。
如果它出现在任何函数定义之外(在文件范围)或者如果它有关键字static
,那么它有静态存储持续时间,这意味着它在程序的整个执行过程中持续存在。
使用 malloc
或 calloc
分配的对象具有分配的存储持续时间,这意味着它们将继续存在,直到它们被显式释放调用 free()
。这些对象通常分配在“堆”上。 (我忽略了 realloc()
,这使描述有点复杂。)
关于c - 在没有 Malloc 的情况下分配结构数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18901797/