我试图在c中动态分配一个结构数组,这样我就可以像使用静态声明一样引用它们。我知道calloc()执行了将所有已分配的内存初始化为0的附加步骤。但是,除此之外,2对于以下代码是完全可互换的吗?如果我使用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);
谢谢。
答案 0 :(得分:1)
他们不一样。声明如下数据:
struct s_myStruct stuff[MAGIC];
如果你在函数范围内声明它,那么会使内存保持未初始化状态(在第二种选择时你必须这样做)。在分号之前添加= {0}
可以解决这个问题。
使用calloc的第二个选择是在堆上分配内存。
但总有一点不同:sizeof(stuff)
在第一种情况下是13 * sizeof(struct s_myStruct),在第二种情况下是指针的大小。
答案 1 :(得分:0)
你真的不想做第一个,因为你要在堆栈上放置13 * 3 * 6000 * 400 * 4 = 370MB。
但这与使用fread
和fwrite
无关。