如何声明一个全局结构数组并在不同的函数中使用它?

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 中使用它

为啥当我在函数中声明一个名称为全局数组的局部数组时,bash 会引发未绑定变量警告?

C语言中如何定义全局变量

在类中声明数组并在构造函数中初始化

为啥全局数组大小应该是一个整数常量?

在 PL/SQL 包中声明全局异常