关于结构体和共用体的数组成员初始化问题

xcv163169 2018-03-22 09:20:23
学到结构体和共用体时,发现对结构体的数组成员初始化时没办法对指定的这一项进行初始化,只能依次对成员进行初始化,比如
#include<stdio.h>
struct Stu
{
int s;
char t[5];

};
int main()
{
struct Stu a={.t="sss"};
printf("%s",a.t);
return 0;
}
就报错 [Error] sorry, unimplemented: non-trivial designated initializers not supported

对共用体的数组成员初始化时可以这样写
#include<stdio.h>
union Stu
{
int s;
char t[5];

}a={.t="sdas"};
int main()
{
printf("%s",a.t);
return 0;
}
但是初始化的时候.t="adas",这一行只能讲char t[5]的5个内存单元全部赋值才可以成功,否则改成={.t="sda"}报错
[Error] C99 designator 't' outside aggregate initializer

请问对结构体的初始化是只能依次初始化吗,还是有其他的方法呢。
对共用体的初始化,是只能将数组成员全部赋值吗,还是有其他的方法能像对数组的初始化一样可以让其他元素自动定位‘\0’
...全文
1537 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-24
  • 打赏
  • 举报
回复
char *t1="str";//编译器支持:将t1的值初始化为常量字符串"str"的起始地址
char t2[5]="str";//编译器不支持:将常量字符串"str"的内容复制一份到&t2[0]开始处
我猜。
xcv163169 2018-03-23
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
对结构体某一成员初始化是语法糖。 语法糖越甜,编译调试查错越苦! 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。
这不是什么语法糖为了找方便捷径什么的事情。这是我认为我对这个知识点有问题,我想要解决它,才来问问题,难道我心里明明对这个地方不懂。要装着没这个问题一样过了它吗? 或者,老师,这个问题能不能帮助我一下,我问了很多人,还是无法解决
赵4老师 2018-03-23
  • 打赏
  • 举报
回复
对结构体某一成员初始化是语法糖。 语法糖越甜,编译调试查错越苦! 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。
xcv163169 2018-03-22
  • 打赏
  • 举报
回复
引用 13 楼 xcv163169 的回复:
[quote=引用 12 楼 weixin_39587157 的回复:] 打错了 a.t 代表的是字符数组t 的首地址
首地址这个问题。我也不知道具体的。但是初始化的时候应该可以吧。毕竟共用体里是可以这样初始化的。你说的第二点是我觉得是赋值吧,赋值跟初始化不一样吧。。[/quote] 我看的教材上有这样的话 C99标准允许对某一成员初始化,如: struct Student b={.name="xxxxxx"};前面声明的时候struct Student{ long int num; char name[20] };
xcv163169 2018-03-22
  • 打赏
  • 举报
回复
引用 12 楼 weixin_39587157 的回复:
打错了 a.t 代表的是字符数组t 的首地址
首地址这个问题。我也不知道具体的。但是初始化的时候应该可以吧。毕竟共用体里是可以这样初始化的。你说的第二点是我觉得是赋值吧,赋值跟初始化不一样吧。。
仙剑老祖 2018-03-22
  • 打赏
  • 举报
回复
打错了 a.t 代表的是字符数组t 的首地址
仙剑老祖 2018-03-22
  • 打赏
  • 举报
回复
struct Stu a={.t="sss"}; 这样初始化是不行的,因为a.t 代表的是字符数组a的首地址,相当于常量,怎么可以给 a.t 赋值呢? 1.如果你想初始化,最好整体初始化 struct Stu ={5,"sss" }; 2.如果你想单个成员初始化的话;加头文件#include<string.h> struct Stu *a,t; a=&t; a->s=5; strcpy(a->t,"sss");
GuDongYu1 2018-03-22
  • 打赏
  • 举报
回复
调试,或者依次输出共用体里那个数组的元素看看,不用字符串输出,(我一般这么查问题)
xcv163169 2018-03-22
  • 打赏
  • 举报
回复
引用 8 楼 no_emotion 的回复:
楼主,你试试把.t改为.t[ ]
.t表示的是a中的成员a.t,t已经定义好了[5]个长度,我也试了这样是不行的
GuDongYu1 2018-03-22
  • 打赏
  • 举报
回复
楼主,你试试把.t改为.t[ ]
自信男孩 2018-03-22
  • 打赏
  • 举报
回复
引用 5 楼 xcv163169 的回复:
引用 3 楼 no_emotion 的回复:
初始化字符数组,如果输出用%s,初始化最后必须主动加\0,结构体和共用体应该都这样,但是你用四个字符初始化5数量的数组,为什么能成功就不知道了(新手,水平有限)
.对字符数组初始化的时候不是会在最后加上\0算一个元素吗
'\0'和数值0是相等的。即'\0'字符的ASCII值对应的十进制是0,即0 == ‘\0', 你在判断字符串结束标记时,可以直接判断是否等于0 比如下面就是计算字符串的长度的逻辑代码,

char src[] = "hello";
int i = 0;
while (src[i] != 0)    /*也可以直接while (src[i])*/
    i++;
xcv163169 2018-03-22
  • 打赏
  • 举报
回复
引用 4 楼 cfjtaishan 的回复:
估计你的编译器不是支持C99的, C99标准支持这样的结构体的初始化。如果不支持,建议你一个个的赋值,或者先这样初始化
struct Stu a = { 0 };
可是对共用体指定第二项数组成员初始化的时候那里不是c99才支持的么。额。我用的是DEV-CPP 5.4.0
xcv163169 2018-03-22
  • 打赏
  • 举报
回复
引用 3 楼 no_emotion 的回复:
初始化字符数组,如果输出用%s,初始化最后必须主动加\0,结构体和共用体应该都这样,但是你用四个字符初始化5数量的数组,为什么能成功就不知道了(新手,水平有限)
.对字符数组初始化的时候不是会在最后加上\0算一个元素吗
自信男孩 2018-03-22
  • 打赏
  • 举报
回复
估计你的编译器不是支持C99的, C99标准支持这样的结构体的初始化。如果不支持,建议你一个个的赋值,或者先这样初始化
struct Stu a = { 0 };
GuDongYu1 2018-03-22
  • 打赏
  • 举报
回复
初始化字符数组,如果输出用%s,初始化最后必须主动加\0,结构体和共用体应该都这样,但是你用四个字符初始化5数量的数组,为什么能成功就不知道了(新手,水平有限)
GuDongYu1 2018-03-22
  • 打赏
  • 举报
回复
引用 1 楼 FOR_SEEK的回复:
结构体可以对某个变量赋值,用{.变量名=值...}就行,共用体是共用一个地址,只需要初始化一个即可,
刚没加载出来,没看完,不懂
GuDongYu1 2018-03-22
  • 打赏
  • 举报
回复
结构体可以对某个变量赋值,用{.变量名=值...}就行,共用体是共用一个地址,只需要初始化一个即可,
单项选择题 (1)在声明一个结构体类型时系统分配给它的存储空间是 。 A. 该结构体类型中第一个成员所需存储空间 B. 该结构体类型中最后一个成员所需存储空间 C. 该结构体类型中所有成员所需存储空间的总和 D. 结构体类型本身并不占用存储空间,即系统并不给结构体类型分配存储空间 【答】D (2)下列说法不正确的是 。 A. 下列结构体声明时,占据了5个字节的空间 struct stru { short int a; short int b; char c; } B. 结构体类型的成员名可以与程序中的变量名相同 C. 结构体类型的成员可以是一个结构体变量 D. 可以单独使用结构体变量中的成员,它的作用相当于普通变量 【答】声明结构体类型时不占据内存空间。本题答案为A。 (3)在定义一个结构体变量时系统分配给它的存储空间是 。 A. 该结构体变量中第一个成员所需存储空间 B. 该结构体变量中最后一个成员所需存储空间 C. 该结构体变量中占用最大存储空间的成员所需存储空间 D. 该结构体变量中所有成员所需存储空间的总和 【答】D (4)下列说法正确的是 。 A. 结构体类型的每个成员的数据类型必须是基本类型 B. 结构体类型的每个成员的数据类型都相同,这一点与数组一样 C. 在声明结构体类型时,其成员的数据类型不能是结构体本身 D. 以上说法都不对 【答】D (5)在定义一个共用体变量时系统分配给它的存储空间是 。 A. 该共用体变量中第一个成员所需存储空间 B. 该共用体变量中最后一个成员所需存储空间 C. 该共用体变量中占用最大存储空间的成员所需存储空间 D. 该共用体变量中所有成员所需存储空间的总和 【答】C (6)以下关于枚举的叙述不正确的是 。 A. 枚举变量只能取对应枚举类型的枚举元素表中元素 B. 可以在定义枚举类型时对枚举元素进行初始化 C. 枚举元素表中的元素有先后次序,可以进行比较 D. 枚举元素的值可以是整数或字符串 【答】D

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧