如何声明一个全局结构数组并在不同的函数中使用它?
Posted
技术标签:
【中文标题】如何声明一个全局结构数组并在不同的函数中使用它?【英文标题】:How to declare a global array of structs and use it in different functions? 【发布时间】: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”),即使它在编译时不知道。我的问题是:我们可以用 [] 声明一个空数组,然后再决定元素的数量吗?
【参考方案1】:
是否也可以用'[]'(未知大小)声明一个数组,然后用malloc动态初始化它?
没有。声明数组时,它必须具有可知的大小。这可以通过在括号中明确地给它一个大小来完成,或者可以通过它的初始化器来推断。一旦设置了它的大小,它将在其生命周期内保持该大小。 malloc
,在最严格的意义上,不会创建一个“数组”,而是返回一个指向内存段的指针,该内存段可以在语法上与数组类似地被索引,但不是真正意义上的数组用[]
声明的对象。
不释放服务器会导致内存泄漏吗?
是的,如果在 malloc
之前不释放 servers
并为它释放更多内存而不释放,则会发生内存泄漏。如果只需要调整数组大小而不丢弃数据,可以使用realloc
。
【讨论】:
以上是关于如何声明一个全局结构数组并在不同的函数中使用它?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 TypeScript 中声明一个全局变量并在 Vue 中使用它