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;
}