我正在尝试动态分配c中的结构数组,以便我可以引用它们,就像我做了静态声明一样。我理解calloc()做了额外的步骤,将所有分配的内存初始化为0。但是,除此之外,对于下面的代码,这两个是完全可以互换的吗?如果我使用fread()和fwrite()从文件中获取这些数据结构,calloc()是帮助还是阻碍这一点?
#define MAGIC 13
struct s_myStruct {
int a[6000][400];
int b[6000][400];
int c[6000][400];
};
struct s_myStruct stuff[MAGIC];
vs
struct s_myStruct *stuff = calloc(MAGIC, sizeof(s_myStruct);
谢谢。
它们不一样。像这样声明数据:
struct s_myStruct stuff[MAGIC];
如果在函数作用域中声明,那么
将使内存未初始化(如果有第二个选择,必须这样做)。在分号前加上= {0}
可以纠正这个错误。
第二个选择,使用calloc,在堆上分配内存。
总是有一个区别:sizeof(stuff)
在第一种情况下将是13 * sizeof(struct s_myStruct),而在第二种情况下指针的大小
你真的不想做第一个,因为你会把13 * 3 * 6000 * 400 * 4 = 370MB放在堆栈上。
但这与使用fread
和fwrite
无关。