现在的位置: 首页 > 综合 > 正文

结构体初始化

2013年09月22日 ⁄ 综合 ⁄ 共 1217字 ⁄ 字号 评论关闭

楼主,这是编译器的问题。你的编译器不支持对一个结构体型的自动(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;
}

抱歉!评论已关闭.