加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

{0}和calloc之间的区别?

发布时间:2020-12-16 10:10:41 所属栏目:百科 来源:网络整理
导读:正如 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)); 撇开一个变量是一个指针的
正如 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都确实设置为零.

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

解决方法

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

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

bar的每个成员都是零初始化的(并且对于没有初始化程序的子对象,或者如果bar是static或thread_local存储类,则填充为零),
所有* bar2都被清零,这可能会产生完全不同的结果:

无效指针(T *)0和值为0的浮点数都不能保证为全位-0.
(实际上,只有char,unsigned char和signed char(以及来自< stdint.h>的一些可选的精确大小类型)才能保证all-bits-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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读