C语言的一道习题中出现的问题.!高手送高分

来源:百度知道 编辑:UC知道 时间:2024/05/31 23:45:16
#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]);
}
========================
上面是代码..初看我觉得没什么问题.编译运行的时候提示/*注释*/部分非法赋值.....
问题出在哪里?
说错了,是提示非法的初始化

楼主,这是你的编译器的问题。你的编译器不支持对一个结构体型的自动(automatic)变量内部的域进行一次性初始化。在这样的编译环境下,任何类似
struct s1 b = { "hello", 1, &b };
这样的初始化的语句都是非法的。你的编译器多半是TC吧,我试了,TC确实不允许这样的初始化, TC++里面编译这样的C代码也不行,看来Borland的开发者们还是忠于的早期的C风格。早期的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++里面,就会出错。

另外,楼上说你的这条语句有问题
printf("%c\n",++a[i].s[3]);
其实没有语法错误,这条语句的意思是(假设i=1,