当前位置: 代码迷 >> C语言 >> 结构体的初始化
  详细解决方案

结构体的初始化

热度:228   发布时间:2008-05-08 23:18:42.0
结构体的初始化
在定义的一个结构体中
  struct student
     {
            char name[10];
            float score;
            char sex;
            };
     struct student a={"famin",100,'M'};可以这样初始化,但假如我要一个一个的初始化改怎么样呢?为什么对name的初始化a.name={"famin"};不对呢?
搜索更多相关的解决方案: 结构体  name  student  char  famin  

----------------解决方案--------------------------------------------------------
用strcpy
----------------解决方案--------------------------------------------------------
回复楼上的
书上就是用strcpy的,但我想知道a.name={"famin"};为什么不行,你告诉我用strcpy好象答非艘问吧?我要的是原因
----------------解决方案--------------------------------------------------------
因为你在声明的时候可以指向一个常量空间,
但是赋值的时候就不行
你又不愿意声明时候赋值,就只能用字符串拷贝,或者给数组逐个赋值
回答完毕
----------------解决方案--------------------------------------------------------
回楼主是不可以的..在你声明变量的s的时候name就定了..
当你定义为struct student a的时候,
里面的数组是被初始化为空的,由于数组的名字是常量后面的赋值是不合法的;
撇开结构体:
1.char c[100]={"famin"};ok
2.char c[100];
c={"famin"}; wrong
而struct student a={"famin",100,'M'};
可以看成初始化char c[100]={"famin"};

[[it] 本帖最后由 sunkaidong 于 2008-5-8 23:37 编辑 [/it]]
----------------解决方案--------------------------------------------------------
感谢moonwalker
moonwalker 说对了,因为在定义的时候name[10]表示一个数组而在引用的时候name[10]则表示数组name[10]的第10个元素
----------------解决方案--------------------------------------------------------
我感觉你理解的还是不对。。。
----------------解决方案--------------------------------------------------------
"famin"这个东西是const char*
a.name是char *
可以把const char 或char型数据的地址赋给const char *
但是不能把const char型数据的地址赋给char *
还真是绕口
----------------解决方案--------------------------------------------------------
其实很简单。
{"fname"}这样的东西,有个专门的名字,LZ你记住,叫做“初始化参数表”。你看一对大括号围着的,像不像一个表格呢?这样的表格是C语言的福利。可以让你[bo]在定义时[/bo]向结构体啊,数组啊里面复制东西。注意,是复制东西,换句话说这其实就是strcpy,只不过是系统帮你完成了,不需要你显式调用而已。
而既然叫做“初始化”参数表。自然只能够在初始化的时候使用。一旦初始化结束,就再没有“后悔药”吃了。所以写a.name="fname";不对,这个时候,你已经初始化结束了。当然你可以使用strcpy,这和使用初始化参数表的效果是一样的~~~~
----------------解决方案--------------------------------------------------------
回复 8# 的帖子
你确定??
a的类型是char[10],绝对不是char*。在数组传参的时候,a会自动退化为const char*,然后再[bo]传值[/bo]给char*。所以看起来好像传给函数的时候,和char*是一样的。但是char[10]和char*有着本质的不同!
顺便说一下因为C只有传值这一种传参方式,所以const和non-const的区别不明显。你可以试试看,将char[10]传给void func(char* &str),看看是什么结果。
GCC显示“无法将临时char*变量赋给非常量引用”,这印证了我关于数组退化为指针的观点。VC显示“无法将char[10]转换为char *&,这印证了我关于数组是一种独立类型的观点。
----------------解决方案--------------------------------------------------------
  相关解决方案