我正在阅读Yashavant Kanetkar的书Let us C。
在指针数组部分,有一段代码给我带来了问题:
int main()
{
static int a[]={0,1,2,3,4}; //-----------(MY PROBLEM)
int *p[]={a,a+1,a+2,a+3,a+4};
printf("%u %u %d\n",p,*p,*(*p));
return 0;
}
我不明白为什么必须将数组a
初始化为静态。我尝试在没有static关键字的情况下初始化它,但是我收到了一条错误,说“非法”。请帮忙。
答案 0 :(得分:5)
C90(6.5.7)
具有静态存储持续时间的对象的初始值设定项中的所有表达式或具有聚合或联合类型的对象的初始化列表中的所有表达式都应为常量表达式。
并且您正在初始化具有聚合类型的对象,因此必须在编译时知道该值,并且在这种情况下不会自动变量的地址。
注意这已在C99(6.7.8 / 4)
中发生了变化具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。
对具有聚合或联合类型的对象的约束已被删除,我没有发现它放在其他地方。你的静态删除代码应该被C99编译器接受(例如它是gcc -std=c99
,这似乎证实我没有忽略其他地方的约束。)
答案 1 :(得分:2)
我的猜测是数组初始化程序的内容必须是编译时常量。通过对函数中的局部变量使用static
,您基本上可以将该变量设置为全局变量,但本地范围除外。