c - 在没有 Malloc 的情况下分配结构数组?

标签 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()。

我做错了什么吗?

最佳答案

这个:

COUNTRY countries[128];

简单地定义了一个类型为“128个COUNTRY元素的数组”的对象。

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

COUNTRY countries[128] = { 0 };

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

如果声明发生在函数定义内,则数组对象具有自动存储期限,这意味着当执行到封闭 block 的末尾时它不再存在。此类对象通常分配在“堆栈”上。

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

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

关于c - 在没有 Malloc 的情况下分配结构数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18901797/

相关文章:

c - realloc 二维结构体数组

c++ - 遍历链表和修改或插入节点C++

c++ - Vim 找不到 C++ libavformat/libavutil 库(没有那个文件或目录)

javascript - 关于我正在创建的网页的问题

php - 如何将数组值添加到 MySQL 查询?

c++ - 使用 malloc、char 数组和指针

c - 转置二维数组

c - 如何在C中的指针(**指针)的末尾添加一个字符串

c - 链表问题

C++ 缓存友好方式访问 `vector <struct_type>` 的所有元素的所有成员