gpt4 book ai didi

c - {0} 和 calloc 之间的区别?

转载 作者:太空狗 更新时间:2023-10-29 15:50:28 25 4
gpt4 key购买 nike

作为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));

撇开一个变量是指针这一事实不谈。
查看调试器,我们可以看到对于上述两个示例,ab 确实都设置为零。

以上两个例子有什么区别,有什么陷阱或隐藏的问题吗?

最佳答案

是的,有一个关键的区别(除了类型为 struct foo 的对象的存储类):

struct foo bar = {0};
struct foo * bar2 = calloc(1, sizeof *bar2);

bar的每个成员是零初始化的(对于没有初始化器的子对象,填充被清零,或者如果 bar 属于 staticthread_local 存储类),
而所有 *bar2被清零,这可能会产生完全不同的结果:

都不是空指针 (T*)0也不能保证值为 0 的 float 都是位 0。
(实际上,仅对于 charunsigned charsigned char (以及来自 <stdint.h> 的一些可选的精确大小类型)保证所有位 0 匹配值 0 直到某个时间在 C99 之后。后来的技术更正保证它适用于所有整数类型。)

浮点格式可能不是 IEEE754。

(不过在大多数现代系统上你可以忽略这种可能性。)

引用自c-faq (感谢 Jim Balter for linking it):

The Prime 50 series used segment 07777, offset 0 for the null pointer, at least for PL/I.

关于c - {0} 和 calloc 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26664160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com