我需要一个全局数组,其大小取决于用户。问题是我不知道如何全局声明一个数组,但在获取用户输入以了解其大小后稍后对其进行初始化。我什至不确定是否可能,因为数组的存储是在程序开始运行后分配的。所以我的问题是,在声明大小为 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)
您可以在运行时动态分配数组,如下所示:
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)
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |