【问题标题】:How to dynamically allocate memory for an array of structs如何为结构数组动态分配内存
【发布时间】:2017-01-23 21:15:49
【问题描述】:

我是 C 的新手,在弄清楚如何将连续内存分配给结构数组时遇到了麻烦。在这个作业中,我们得到了一个代码的外壳,剩下的必须填写。因此,我无法更改变量名称或函数原型。这是给我的:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct student {
    int id;
    int score;
};

struct student *allocate() {
    /* Allocate memory for ten students */
    /* return the pointer */
}

int main() {
    struct student *stud = allocate();

    return 0;
}

我只是不确定如何去做那些 cmets 在 allocate 函数中所说的操作。

【问题讨论】:

  • 获得更好的课程。不鼓励函数签名,将从未来的标准中删除。使用原型风格,例如int main(void).

标签: c arrays memory-management struct contiguous


【解决方案1】:

分配和初始化数组的最简单方法是:

struct student *allocate(void) {
    /* Allocate and initialize memory for ten students */
    return calloc(10, sizeof(struct student));
}

注意事项:

  • calloc()malloc() 不同,它将内存块初始化为所有位为零。因此,数组中所有元素的字段idscore 都被初始化为0
  • 最好将学生人数作为参数传递给函数allocate()
  • 当您不再需要它时,free() 分配的内存被认为是一种很好的风格。你的导师没有暗示你应该在从main()返回之前调用free(stud);:虽然不是绝对必要的(程序分配的所有内存都在程序退出时由系统回收),这是一个好习惯在大型程序中更容易定位内存泄漏。

【讨论】:

  • 使用calloc(10, sizeof(struct student)) 遵循void *calloc(size_t nmemb, size_t size); 的C 规范风格
  • @chux:确实!答案已更新。太糟糕了calloc() 参数顺序与fread()fwite()...的参数顺序不一致...但与qsort()bsearch()...的参数顺序一致...我从未见过顺序很重要的架构,并且我很好奇这需要什么。
  • @chqrlie 同意你的 cmets。在一个甚至不确定分配的乐观分配系统中,系统可能会使用 size 作为未来分配的量,但我怀疑事情是相当可沟通的。
  • calloc() 将所有位设置为零非常简洁。我不知道,为了学习新的东西,我很感激我一直在关注这个帖子;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 2021-11-27
  • 2012-03-12
  • 1970-01-01
  • 2013-12-25
  • 2020-02-03
相关资源
最近更新 更多