C中的静态数组初始化

Yun*_*nus 3 c arrays pointers

我正在读Yashavant Kanetkar 的书" 让我们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;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么必须将数组a初始化为静态.我尝试在没有static关键字的情况下初始化它,但是我收到了一条错误,说"非法".请帮忙.

APr*_*mer 5

C90(6.5.7)有

具有静态存储持续时间的对象的初始值设定项中的所有表达式或具有聚合或联合类型的对象的初始化列表中的所有表达式都应为常量表达式.

并且您正在初始化具有聚合类型的对象,因此必须在编译时知道该值,并且在这种情况下不会自动变量的地址.

请注意,这已在C99(6.7.8/4)中发生变化

具有静态存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字.

对具有聚合或联合类型的对象的约束已被删除,我没有发现它放在其他地方.你的静态删除代码应该被C99编译器接受(gcc -std=c99例如,它似乎证实我没有忽略其他地方的约束).