关于结构体初始化

结构体目前的初始化方法,目前一是创建结构体是一一对应赋值,类似struct={1,2}; 二是通过调用接口memset,或者自定义函数清零。 我曾经在一本书上看到可以通过struct={}清零, 但是在使用过程中不被认可, 在网上也没有相应使用的人。不知道有没有同样看过这本书的人。
提问的目的:struct = {} 这种初始化方式在哪本书上有提到过, 是否合法, 有没有可能产生不可预期的错误。

这个是有原理的。
简单说一下吧:
1.要从数组开始说。
比如int a[10]={0};其实系统只是把第一个数赋值为0,其他的数因为没有参数,系统自动初始化为0,对于int型来说。对于char来说就是‘\0x0’。其他的类型类似。
如果是int a[10]={1};那么就是第一个数是1,其他的数是0。就是1,0,0,0.......
2.下面到结构。结构和数组有点类似;
比如:
typedef struct Text{
int a;
float b;
char c[10];
}text;
如果我写了text temp={1,2,"mmm"};那么就可以正常全部初始化成功,参数符合。
如果我写了text temp1={1};那么就会变成给这个结构固定的参数赋值,这里是给a赋值,其他的参数类似数组全部系统自己初始化。
那么如果写了text temp2={};?就会变成直接全部系统初始化。具体类似于int a[10]={};
参考资料:http://blog.csdn.net/s_k_yliu/article/details/7020746
可以参考代码:
测试平台:Devc++
#include<stdio.h>
#include<math.h>
typedef struct Text{
int a;
float b;
char c[10];
}text;
int main(){
int a[10]={};
int b[10]={0};
int c[10]={1};
int i;
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
for(i=0;i<10;i++)
printf("%d",b[i]);
printf("\n");
for(i=0;i<10;i++)
printf("%d",c[i]);
printf("\n");
text temp={1,2.0,"shi"};
printf("%d %f %s\n",temp.a,temp.b,temp.c);
text temp1={1};
printf("%d %d %s\n",temp1.a,temp1.b,temp1.c);
text temp2={};
printf("%d %d %s\n",temp2.a,temp2.b,temp2.c);
return 0;
}追问

其实测试结果肯定是已经清零的, 不过如果结构体成员是结构体的初始化,如果还是初始化为{0}, 那么就会报错missing braces around initializer。 初始化为{}是最简单的版本。 但没有在书籍上看到有={}是系统初始化的说明。我已经使用过={}可以初始化任何负责的结构体, 我现在需要的是一个可靠的理论基础,那就是 结构体 ={} 这样初始化时合法的。

追答

报错?你用的什么编译器?
我用的编译器是Devc++5.5.1。
我给你的代码在这里是不会报错的。
如果你报错了,应该是c语言规范版本或者编译器版本问题。
可以去参考c99。
其实我不太懂你的意思。最好贴代码上来,以及写出你的测试平台。如果有输入输出,写出来。
参考我的回答规范。

追问

编译参数不同, 应该算是警告missing braces around initializer。 不需要代码, 你定义一个结构体, 结构体首个成员也是结构体, struct = {0}就会报错。 我不需要纠结这个, 我想知道的其实是struct = {}这种初始化方式, 有没有那本书上明确说明这样做是合法的, 不会出现不可预期的错误。

追答

你在结构体里面加了一个结构体的话,初始化方式肯定就会不同了。
struct={}我也不知道在那本书上面有写。
你要是想知道,就去看《The C++ Programming Language》6.6章。我给你连接上面有提到。
个人理解是可以的。读死书不如不读书。

追问

写代码一定要有理有据,个人理解是不行的, 否则在项目中出现隐蔽性极强的bug, 你哭都来不及。 逻辑可以活用, 但是使用一定得规范。http://down.51cto.com/data/128409。参考微软一站式示例编程规范。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-10-27
你这里只定义了一个结构体,但是没有示例。应改为:
typedef
struct
{
unsigned
char
bit0
:1;
unsigned
char
bit1
:1;
unsigned
char
bit2
:1;
unsigned
char
bit3
:1;
unsigned
char
bit4
:1;
unsigned
char
bit5
:1;
unsigned
char
bit6
:1;
unsigned
char
bit7
:1;
}ledvalue;
struct
ledvalue
ledval={1,1,1,1,1,1,1,1};
第2个回答  2019-04-22
Data
MyVar1={.ch="c"};
如果该域的值是确定的,可以使用常量。
如果希望给域一个默认值,是行不通的。要设置一个变量,必须有对应的指令,不能凭空改变。在c++中这个过程可以在构造函数中实现,而c则不行。
个人观点,仅供参考!
相似回答