【发布时间】:2014-10-30 22:07:37
【问题描述】:
正如this answer on another question 所述,使用聚合初始化
struct foo {
size_t a;
size_t b;
};
struct foo bar = {0};
导致内置类型被初始化为零。
使用上面和使用有什么区别
struct foo * bar2 = calloc(1, sizeof(struct foo));
暂且不说一个变量是指针这一事实。
查看调试器我们可以看到,对于上述两个示例,a 和 b 确实都设置为零。
以上两个例子有什么区别,有什么陷阱或隐藏的问题吗?
【问题讨论】:
-
现在我很好奇 - 如果我们将
calloc替换为alloca后跟memset为零会怎样?那么会有什么明显的区别吗? -
alloca是非标准的。此外,alloca在堆栈上分配,而不是在堆上分配,并且它不会报告错误(分配比可用内存更多的内存具有未定义的行为,并且可能会导致您的程序在检测到错误之前崩溃)。 -
"它不报错" -- 调用函数也不报错,这也会破坏堆栈。该标准的一个技术缺陷是它不保证堆栈深度,因此几乎没有 C 程序严格符合。
-
如果您正在寻找有关初始化类型的答案,那么我建议您将问题更改为“{0} 和 memset 之间的差异”,然后执行
struct foo bar2; memset(&bar2, 0, sizeof bar2); -
"那么会有什么明显的不同吗?" -- 两者都将所有位设置为零,这在理论上与将它们设置为零值不同(参见 Deduplicator 和 Keith Thompson 的答案)。
标签: c