【问题标题】:Allocate a structure by calloc(): To which value the members are initialized?通过 calloc() 分配结构:成员初始化为哪个值?
【发布时间】:2020-08-21 05:27:08
【问题描述】:

例如我有一个struct

struct s{
    char c;
    int x;
};

我使用calloc() 分配内存。

s *sp = (s*) calloc(1, sizeof(s));

现在sp->csp->x 的值是多少?

【问题讨论】:

  • calloc() 将内存初始化为零。 sp->csp->x 将是 0(分别为 charint 类型)。顺便说一句:强制转换 calloc() 的返回值充其量是多余的(并且可能隐藏一个错误,如果没有强制转换,编译器会警告你)。
  • 回答标题中的问题:字符存储为数字。还是您的意思是结构,而不是字符?整个结构将被清零:它的所有成员,以及任何留作填充的空间。
  • 如果您不想要 C++,请在源文件顶部添加 #ifdef __cplusplus / #error bad compiler / #endif

标签: c memory-management struct dynamic-memory-allocation calloc


【解决方案1】:

"sp->csp->x 的值是什么?"

由于calloc() 将分配内存的所有位设置为0,如果0 的值表示intchar0 的所有位(这是常见的)。

请注意,在指针的情况下,当仅将所有位设置为 0 时,指针可能不是符合标准的 NULL 指针,因为 C 标准不要求 NULL 指针的表示是全部-零位。


旁注:

1.

struct s{
    char c;
    int x;
};

s *sp = (s*) calloc(1, sizeof(s));

不能作为s 不是typedefd 类型工作;它是一个结构标签。因此,您需要在 s 前面加上 struct 关键字:

struct s *sp = (struct s*) calloc(1, sizeof(struct s));

2.

您不需要从calloc() 和其他内存管理函数中转换返回的指针,而是避免它,因为它会给您的代码添加混乱。 -> Do I cast the result of malloc

所以,做吧:

struct s *sp = calloc(1, sizeof(struct s));

【讨论】:

  • 如果我有class 而不是struct 怎么办?而且在我的编译器上,至少这不起作用,我必须进行强制转换,它说它不能用 void* 类型的值初始化 [type]* 类型的变量
  • @platinoob_ 首先,类属于 C++,而不是 C。C 和 C++ 是非常不同的语言。 C 代码不必与 C++ 编译器一起工作,反之亦然。这个问题用 C 标记,并且提供的代码是 C 代码。我回答了你对 C 的问题。如果你在特定的 C++ 代码中有问题,请提出一个单独的问题并用 C++ 标记它,而不是 C。这不属于这里。它还需要更多的信息,而不仅仅是在此评论部分显示一点信息。我们需要看到确切的代码和确切的编译器调用命令。
  • @RobertS 支持 Monica Cellio,如果我的评论不清楚,我很抱歉,“类而不是结构”只是一个问题,评论是关于我必须做演员或其他: cannot initialize a variable of type 's *' with an rvalue of type 'void *' s *sp = calloc(1, sizeof(struct s));
  • @platinoob_ 问题是:我无法重现该问题。最好单独提出一个问题。
猜你喜欢
  • 2020-12-17
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2020-10-08
相关资源
最近更新 更多