在 C 中声明后初始化全局数组

1 c arrays global

我需要一个全局数组,其大小取决于用户。问题是我不知道如何全局声明一个数组,但在获取用户输入以了解其大小后稍后对其进行初始化。我什至不确定是否可能,因为数组的存储是在程序开始运行后分配的。所以我的问题是,在声明大小为 t 的数组后如何初始化全局数组?

// What I want to achieve 
...
struct some_name* sn;
...

int main(){
...
   sn = some_name[t]; // Where t is unkown before running the code
...
}
Run Code Online (Sandbox Code Playgroud)

pma*_*ane 5

您可以在运行时动态分配数组,如下所示:

struct some_name* sn;
....
sn = malloc(t * sizeof(struct some_name));
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是您要重复类型名称两次,并且如果类型sn发生更改,您也必须记住更改malloc()

避免此问题的等效替代方案是:

sn = malloc(t * sizeof *sn);
Run Code Online (Sandbox Code Playgroud)

by 分配的内存malloc()未初始化,并且可能包含任何内容。如果你想要零填充内存,你可以使用:

sn = calloc(t, sizeof *sn);
Run Code Online (Sandbox Code Playgroud)

完成后不要忘记释放内存:

free(sn);
Run Code Online (Sandbox Code Playgroud)

另外,不要忘记,如果它们无法分配您请求的内存,则两者malloc()calloc()可以返回。NULL您应该始终检查这一点,并适当地处理错误。

编辑:请注意,struct some_name* sn;定义了一个指针,而不是一个数组。为其分配所需的内存并设置sn为该值后,可以将其视为数组,例如,您可以使用相同的[]符号访问其元素:

sn[0].foo = 12;
Run Code Online (Sandbox Code Playgroud)