3

我正在阅读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 关键字的情况下对其进行初始化,但出现“非法”错误。请帮忙。

4

2 回答 2

5

C90 (6.5.7) 有

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

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

请注意,这在 C99 (6.7.8/4) 中已更改

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

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

于 2012-08-30T06:36:56.917 回答
2

我的猜测是数组初始化程序的内容必须是编译时常量。通过static在函数中使用局部变量,您基本上可以使该变量成为全局变量,但具有局部范围除外。

于 2012-08-30T06:29:00.797 回答