关于结构体初始化
结构体目前的初始化方法,目前一是创建结构体是一一对应赋值,类似struct={1,2};二是通过调用接口memset,或者自定义函数清零。我曾经在一本书上看到可以通过st...
结构体目前的初始化方法,目前一是创建结构体是一一对应赋值,类似struct={1,2}; 二是通过调用接口memset,或者自定义函数清零。 我曾经在一本书上看到可以通过struct={}清零, 但是在使用过程中不被认可, 在网上也没有相应使用的人。不知道有没有同样看过这本书的人。
提问的目的:struct = {} 这种初始化方式在哪本书上有提到过, 是否合法, 有没有可能产生不可预期的错误。 展开
提问的目的:struct = {} 这种初始化方式在哪本书上有提到过, 是否合法, 有没有可能产生不可预期的错误。 展开
3个回答
展开全部
这个是有原理的。
简单说一下吧:
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;
}
简单说一下吧:
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。
其实我不太懂你的意思。最好贴代码上来,以及写出你的测试平台。如果有输入输出,写出来。
参考我的回答规范。
北京羿射旭科技有限公司
2019-11-29 广告
2019-11-29 广告
高阻尼隔震橡胶支座的价格大概在每个一两百元,便宜的有十几二十元,贵的有好几百元。高阻尼隔震橡胶支座的价格受多方面影响,如品牌、类别、规格、市场等。关键还是要学会挑选方法。变检算是否满足相应地震力作用下的使用要求。b..应根据跨度和温度变化幅...
点击进入详情页
本回答由北京羿射旭科技有限公司提供
展开全部
你这里只定义了一个结构体,但是没有示例。应改为:
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};
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};
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Data
MyVar1={.ch="c"};
如果该域的值是确定的,可以使用常量。
如果希望给域一个默认值,是行不通的。要设置一个变量,必须有对应的指令,不能凭空改变。在c++中这个过程可以在构造函数中实现,而c则不行。
个人观点,仅供参考!
MyVar1={.ch="c"};
如果该域的值是确定的,可以使用常量。
如果希望给域一个默认值,是行不通的。要设置一个变量,必须有对应的指令,不能凭空改变。在c++中这个过程可以在构造函数中实现,而c则不行。
个人观点,仅供参考!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询