C - calloc, malloc和动态结构分配



我正在尝试动态分配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放在堆栈上。

但这与使用freadfwrite无关。

最新更新