结构体初始化列表未指明的字段保证是0吗,还是未定义行为

C语言 码拜 8年前 (2016-05-28) 1206次浏览
本人看别人的代码有这样写, 本人写了代码,结果是0,但本人怕是未定义行为
解决方案

2

不保证

15

C:

引用:
Quote: 引用:

不要轻信任何约定。

您的意思是标准规范没人遵守?

遵不遵守,不是看怎么说的,是要看怎么做的。
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
况且100%怎么说就怎么做是不可能办到的。
1+1=2这种事,古往今来发生过哪怕一次吗?

1

引用:
Quote: 引用:

不要轻信任何约定。

您的意思是标准规范没人遵守?

各种编译器都还是朝着完全遵守标准走的。知道是符合标准的代码,各家编译器行为都会一致的。
否则就没有正确的代码了。

2

为0结构体初始化列表未指明的字段保证是0吗,还是未定义行为

1

在没有使用至少不同的五个编译器和开发环境之前,不要轻易下结论。个人意见。

2

引用:
Quote: 引用:

不保证

假如是c++呢,最好引用:

@fefe82
你对标准好像很有研究,说一下你的看法

这个标准是有明确规定的,不是未定义行为。

1

c++也不保证,原因是C++使用初始化列表或构造函数来完成初始化工作的。

1

引用:

@fefe82
你对标准好像很有研究,说一下你的看法

“结构体初始化列表” 指的是啥?
A():a(1),b(2) {}  这个吗?
还是这个:
A a{1, 2};

1

引用:
Quote: 引用:
Quote: 引用:

不要轻信任何约定。

您的意思是标准规范没人遵守?

各种编译器都还是朝着完全遵守标准走的。知道是符合标准的代码,各家编译器行为都会一致的。
否则就没有正确的代码了。

标准也是人定的,是人就会出错。不轻信,不是不信。

1

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

不要轻信任何约定。

您的意思是标准规范没人遵守?

各种编译器都还是朝着完全遵守标准走的。知道是符合标准的代码,各家编译器行为都会一致的。
否则就没有正确的代码了。

标准也是人定的,是人就会出错。不轻信,不是不信。

1 标准总是对的
2 假如标准错了,请参考第一条

5

引用:

@fefe82
你对标准好像很有研究,说一下你的看法

4楼已经引过标准了,C99 6.7.8 Initialization / 20 ,不重复了。

1

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

不要轻信任何约定。

您的意思是标准规范没人遵守?

各种编译器都还是朝着完全遵守标准走的。知道是符合标准的代码,各家编译器行为都会一致的。
否则就没有正确的代码了。

标准也是人定的,是人就会出错。不轻信,不是不信。

1 标准总是对的
2 假如标准错了,请参考第一条

在现实世界:
1. 1+1从来就没有真正=2过!
2. 假如你发现这次好象1+1=2了,请参考第1条。
结构体初始化列表未指明的字段保证是0吗,还是未定义行为

1

不保证,是未定义的行为。
但是有些编辑器,在debug版本的时候会增加一个做初始化的动作,
在release版本就没有。
所以有些时候我们会碰到debug版本是好的,release版本程序报错的情况。

2

引用:
Quote: 引用:
Quote: 引用:

@fefe82
你对标准好像很有研究,说一下你的看法

4楼已经引过标准了,C99 6.7.8 Initialization / 20 ,不重复了。

另外本人对第9点比较困惑,里面说的unnamed members of structure objects到底是怎样的
结构体初始化列表未指明的字段保证是0吗,还是未定义行为

unnamed bitfield, padding …
struct a{
char c;
// 这里可能有 3 byte padding
int i;
char c1:1;
char :7; // unnamed bit-field
// 最后可能还有几个字节 padding
};


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明结构体初始化列表未指明的字段保证是0吗,还是未定义行为
喜欢 (0)
[1034331897@qq.com]
分享 (0)