【问题标题】:calloc, malloc and dynamic struct allocationcalloc、malloc 和动态结构分配
【发布时间】:2011-12-18 18:10:36
【问题描述】:

我正在尝试在 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);

谢谢。

【问题讨论】:

  • 这和文件有什么关系?
  • 您也可以为您的数组使用“通用零初始化器”:struct s_myStruct stuff[MAGIC] = {0};

标签: c arrays malloc structure calloc


【解决方案1】:

它们不一样。像这样声明数据:

struct s_myStruct stuff[MAGIC];

如果您在函数范围内声明它,它将使内存保持未初始化状态(您必须这样做,给定第二个选择)。在分号前添加= {0} 可以纠正这个问题。

第二种选择,使用calloc,在堆上分配内存。

但总有区别:sizeof(stuff) 在第一种情况下是 13 * sizeof(struct s_myStruct),在第二种情况下是指针的大小。

【讨论】:

  • 你是说这两种情况完全不同,而在第二种情况下,我所做的只是为指向结构的指针分配存储空间,而不是为结构本身分配存储空间?因此我需要另一个步骤来为结构分配存储空间?
  • 不,它们大体相同——我只是列举了一些不同之处。
【解决方案2】:

你真的不想做第一个,因为你会把 13 * 3 * 6000 * 400 * 4 = 370MB 放在堆栈上。

但这与使用freadfwrite无关。

【讨论】:

  • 我不打算把东西[MAGIC]放在堆栈上;这是一个全球性的。
  • @user994179:在这种情况下,实践中几乎没有什么不同,除了你需要在某些时候free动态版本。此外,正如@Paul 在他的回答中提到的那样,数组和指针在行为上有一些细微的差别。
  • 请原谅我的无知,但如果像 Paul 所说的那样,我只是为指向结构的指针而不是结构本身分配存储空间,那么我提出的两种情况(静态与动态)是完全不同的,如果我想使用动态路由,我需要做其他事情吗?
猜你喜欢
  • 2020-11-26
  • 1970-01-01
  • 2020-03-22
  • 2013-06-06
  • 2017-05-29
  • 2018-07-13
  • 2012-03-02
  • 2014-07-01
  • 2012-10-08
相关资源
最近更新 更多