【问题标题】:How to use calloc to init struct如何使用 calloc 初始化结构
【发布时间】:2020-10-08 04:40:26
【问题描述】:

我有结构

struct Person
{
    char name[50];
    int citNo;
    float salary;
};

现在我做这个代码:

struct Person* p = malloc (sizeof(struct Person));
memset (p,0x00,sizeof(struct Person));

现在我想将其转换为 calloc (clean code) ,我该怎么做?

struct Person* p = calloc(sizeof(struct Person) ,1); 

或者也许把1 不正确?什么是正确的方法?

【问题讨论】:

  • struct Person p* => struct Person *p 对于初学者
  • 嗯,它是void *calloc(size_t nmemb, size_t size);,所以它的参数正好相反。但它可能仍然有效
  • 第一个参数是元素的数量,第二个是每个元素的字节大小
  • 你试过calloc这个电话吗?编译器告诉你什么?
  • 我试过了,但我问这段代码是否正确

标签: c linux malloc calloc


【解决方案1】:

来自 man7 的 calloc() 描述

 #include <stdlib.h>
 void *calloc(size_t nelem, size_t elsize);

calloc() 函数应为数组分配未使用的空间 nelem 元素,每个元素的字节大小为elsize。该空间应 初始化为所有bits 0。存储的顺序和连续性 通过连续调用calloc() 分配的未指定。指针 如果分配返回...

我鼓励您继续阅读链接man7_calloc。

现在在阅读了上面的描述之后,打电话给calloc 对我来说似乎很容易: 在您的情况下,我们分配一个 struct person

的数组
struct Person* p = NULL;
struct Person* p = calloc(1, sizeof(struct Person)); 

你必须检查calloc的返回值(如果calloc成功分配,比如malloc):

if(p == NULL){
  puts("calloc failed");
  ...
  ...
}

【讨论】:

  • 你为什么在calloc之前写struct Person* p = NULL;?如果 calloc 失败,它将返回 NULL
  • 一般和C中的一个好习惯,如果您不确定在声明时将哪个变量的地址分配给指针变量,建议将NULL值分配给您的指针变量。在这种情况下,我们立即将 calloc() 的返回值分配给此指针,因此在这种情况下它不太重要,但作为一般规则,它是一个很好的习惯!
  • @MicrosoctCprog - 如果我的回答对您有帮助,请投票并通过标记附近的灰色 V/新的感谢表情符号来接受它!谢谢。
猜你喜欢
  • 2019-05-17
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2019-04-16
  • 2020-04-08
  • 2020-08-21
相关资源
最近更新 更多