【问题标题】:Allocating array of structures with malloc使用 malloc 分配结构数组
【发布时间】:2014-03-31 04:35:11
【问题描述】:

C - initialize array of structs

您好,我对这个问题有疑问(但我没有足够的代表来评论其中一个答案)。

在@pmg 的最佳答案中,他说你需要做

student* students = malloc(numStudents * sizeof *students);

首先,这是否等同于/简写

student* students = malloc(numStudents * sizeof(*students));

如果是这样,你为什么要 sizeof(*students) 而不是 sizeof(student)

没有人对此发表评论或指责他,所以我假设他正在写作,请尽可能详细地说明两者之间的区别。我真的很想了解它。

【问题讨论】:

    标签: c arrays struct malloc allocation


    【解决方案1】:

    假设您在声明 students 的同时没有初始化它;那么代码将是:

    students = malloc(numStudents * sizeof *students);
    

    我们甚至不知道students 是什么数据类型,但是我们可以看出它正在分配正确的字节数。所以我们确信这一行没有分配大小错误。

    当然,两个版本都分配了相同数量的内存,但这个更不容易出错。

    对于其他版本,如果您在 sizeof 中使用了错误的类型,它可能会暂时被忽视。但在这个版本中,如果左侧的students 与右侧的students 不匹配,则更有可能立即发现问题。

    【讨论】:

    • 我实际上更喜欢sizeof(*students) 来明确表示您不会再进行乘法运算,因此不必担心 sizeof'ing 类型和变量之间的区别 :-)
    • 我更喜欢第一个,以明确它是一个表达式,而不是 type。如果您有良好的命名约定,这不是问题,但情况并非总是如此
    【解决方案2】:

    http://en.wikipedia.org/wiki/Sizeof#Use

    在将 sizeof 与变量和表达式一起使用时,您可以使用不带括号的 sizeof。表达式

    *students 
    

    正在取消引用指向 student 结构的指针,所以

    sizeof *students 
    

    将返回与

    相同的结果
    sizeof(student)
    

    【讨论】:

      【解决方案3】:

      两者没有区别。您也可以通过打印尺寸自行检查。

      【讨论】:

      • 是的。但是你也应该提到什么时候用什么,哪个更好用。
      • 这实际上是您的选择。两者都只是返回结构的大小。但是,如果您使用 *students ,它有助于更​​轻松地检查错误(由您,而不是由编译器),正如其他人提到的那样。但我通常使用 sizeof(type) 而不是 sizeof(*ptr_to_struct) 但两者都是绝对正确的。
      猜你喜欢
      • 2017-05-29
      • 2021-05-13
      • 2021-05-29
      • 2018-09-21
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      相关资源
      最近更新 更多