C语言里面结构体初始化遇到问题!!求助高手!!

#include<stdio.h>structs1{char*s;inti;structs1*sip;};main(){structs1a[]={{"abcd",1,a+... #include <stdio.h>
struct s1
{
char *s;
int i;
struct s1 *sip;
};
main ()
{
struct s1 a[]={{"abcd",1,a+1},{"efgh",2,a+2},{"ijkl",3,a}};/*注释*/
struct s1 *p=a;
int i=0;
printf("%s %s %s",a[0].s,p->s,a[2].sip->s);
printf("%d %d",i+2,--a[i].i);
printf("%c\n",++a[i].s[3]);
}
================
....
struct test
{
char a;
int *p;
};
main()
{
int c=3;
struct test pro={'b',&c};/*注释*/
......
}
================
上面是两个不同的代码..编译运行的时候都提示/*注释*/部分非法赋值.....
问题出在哪里?
请不要在书写正确与错误上作文章,也请不要在最后一个printf语句那里给我讲了,那是正确的,而且我的问题也不是这个,我是问为什么注释部分的初始化提示非法初始化。
我在TC,Lcc-win32上面都编译了,问题一样发生。

希望真正的高手来回答,分数都是其次,我希望能解决问题。
展开
 我来答
day9981
2006-12-30 · TA获得超过1817个赞
知道小有建树答主
回答量:345
采纳率:0%
帮助的人:0
展开全部
楼主,这是编译器的问题。你的编译器不支持对一个结构体型的自动(automatic)变量内部的域进行一次性初始化。在这样的编译环境下,任何类似
struct s1 b = { "hello", 1, &b };
这样的初始化的语句都是非法的。TC确实不允许这样的初始化, TC++里面编译这样的C代码也不行,看来Borland的开发者们还是忠于的早期的C风格。LCC看来也不支持。早期的C以及ANSI C中是不允许对结构体型的自动变量进行一次性初始化的,要进行一次性初始化,除非你把你需要的struct变量声明为静态(static)变量,或全局变量(全局变量被默认为静态类型)。所以在所有函数外,你只要写
struct s1 b = { "hello", 1, &b };就可以,但是在一个函数内部你就要写成
static struct s1 b = { "hello", 1, &b };
(我已经在TC里面调试过了,加上static就可以通过了)
如果你在函数内部没有把b声明为静态变量,你要初始化就必须要写出三条初始化语句,分别对结构体内部的三个域进行初始化。
struct s1 b;
b.s = "hello";
b.i = 1;
b.sip = &b;
你的数组a有三个元素,每个元素都是一个结构体,所以每个元素都得这样初始化,就是说你总共要9条语句才能完成你这个结构体数组的初始化。

不过后来的ISO C标准放宽了限制,对声明为struct类型的自动变量,也允许一次性初始化。其实是允许通过在{}列出常量一次性地完成对结构体内部所有域的赋值操作。这样省掉了编程者书写很多语句来完成对结构体内部的域进行赋值的麻烦。现在的大部分编译器都支持ISO C,像VC和Pelles C之类的,在这些编译环境下都不会出错。但在TC,TC++里面,就会出错。修改后的程序如下,已经在TC成功运行。

#include <stdio.h>
#include <stdlib.h>

struct s1
{
char *s;
int i;
struct s1 *sip;
};

struct s1 a[] = { {"abcd", 1, a+1}, {"efgh", 2, a+2}, {"ijkl", 3, a} };

int
main (void)
{
int i;
static struct s1 b[] = {
"mnop", 4, b+1,
"qrst", 5, b+2,
"uvwx", 6, b
};
struct s1 * pa = a;
struct s1 * pb = b;

i = 0;
printf("%s %s %s\n", a[0].s, pa->s, a[2].sip->s);
printf("%d %d\n", ++i, --a[i].i);
printf("%c\n", ++a[i].s[3]);

i = 0;
printf("%s %s %s\n", b[0].s, pb->s, b[2].sip->s);
printf("%d %d\n", ++i, --b[i].i);
printf( "%c\n", ++(*(b[i].s+3)) );

system("pause");
return 0;
}
百度网友6e017157
2006-12-30 · TA获得超过1046个赞
知道大有可为答主
回答量:2218
采纳率:50%
帮助的人:1258万
展开全部
很想趁这个机会学习一下啊,关键是这里没办法编译你的代码.
不知道你说的是对是错啊.
我感觉楼主第一个代码那样
嵌套定义行不行啊??
第二个好象没有看出什么问题啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式