【发布时间】:2021-09-09 04:06:30
【问题描述】:
抱歉,如果这是重复的,在这种情况下我找不到正确的关键字来搜索。
这是对我正在处理的一些旧 (MUD) 代码的引用,该代码粘贴在下面。我对下面代码的foo_zero 和*foo = foo_zero 部分的用途感到困惑。这是它在整个代码库中使用的模式。我的猜测是,这是一种无需显式设置即可将foo 的所有成员初始化为零/NULL 的方法。
typedef struct FOO {
int buzz;
char *bazz;
} FOO;
FOO *init_foo(void)
{
static FOO foo_zero;
FOO *foo;
foo = malloc(sizeof(*foo));
*foo = foo_zero; // <-- why?
return foo;
}
【问题讨论】:
-
是的,就是这样。
static变量始终是零初始化的,并且提供的代码对foo进行零初始化。曾经可以使用calloc以略少的代码实现相同的结果。 -
使用
calloc()几乎肯定会更有效,但我不确定这是否在语义上相同。 -
@SergeyA 从技术上讲,
calloc()不会初始化指向NULL的指针,但实际上它在通用处理器上会这样做。 -
@SergeyA:没那么简单,见stackoverflow.com/questions/2759845/…和stackoverflow.com/questions/32136092/…,stackoverflow.com/questions/9894013/is-null-always-zero-in-c。您可以在源代码中将
0写为空指针常量,但这并不意味着或要求实际的空指针由零字节组成。 -
@SergeyA 这是一个模糊的区别,在实践中几乎没有什么区别,因为所有常见的实现都使用全零字节作为空指针的表示。但是我使用的第一台计算机是 Multics,它的空指针是全一位。
标签: c struct initialization dynamic-memory-allocation