【发布时间】:2019-09-05 17:54:24
【问题描述】:
从 OO 语言 (C#) 切换,我想知道在 C 中声明具有应用程序生命周期的结构数组的最佳方法是什么。经过 1 小时的努力(并研究例如为什么不使用 typedef,为什么稍后重复 struct 等),这段代码正在工作:
// declaration
struct server {
char* name;
char* ip_address;
int port;
} server;
struct server *servers; // declaring struct server[] servers; does not work
然后在函数中像这样使用,也可以正常工作(在多次实验 & 和 *...之后):
// nb_servers is known from previous calculation
servers = malloc(nb_servers * sizeof(struct server));
// later in the same function
free(servers);
问题
为什么用
[]声明结构数组不起作用?实际上的问题是,是否也可以使用 '[]' (未知大小)声明一个数组,然后稍后使用 malloc 动态初始化它,如果可以,这样做的语法是什么?纯语法问题,与内存管理方式的差异无关。如果我
free(servers)之后我不能再使用这些值。但是如果我不这样做,如果这个函数被多次调用,这个变量的值会被新调用的结果简单地覆盖吗?不释放servers会导致内存泄漏吗?
希望很清楚,我是 C 的 100% 新手。
【问题讨论】:
-
您是否尝试过
struct server servers[100];或类似的方法,具体取决于您希望数组的大小为多少? -
@Wyck 这行得通,但如前所述,数组的大小在声明时是未知的。
-
问题 1 的“为什么”部分与 Why aren't variable-length arrays part of the C++ standard? 重复
-
我什至没有考虑查看 VLA,因为那里有一个大小初始化器(“n”),即使它在编译时不知道。我的问题是:我们可以用 [] 声明一个空数组,然后再决定元素的数量吗?