数组指针问题

时间:2009-02-14 18:30:36

标签: c arrays pointers initialization

我试过这个指针数组的例子。我收到错误“函数main中的非法初始化”

int main()
{
    int a[]={1,2,3,4,5};
    int b[]={1,2,3,4,5};
    int c[]={1,2,3,4,5};
    int *p[3]={a,b,c};
    int i;
    clrscr();
    for(i=0;i<3;i++)
        printf("%d - %u\n",*p[i],p[i]);
    getch();
}

如果我在数组声明中使用static int而不是int,它可以正常工作。任何人都可以告诉我静态效果。非常感谢。

4 个答案:

答案 0 :(得分:5)

在gcc中,如果您使用 -pedantic 标志,则会看到有关此内容的警告。

但这显然已经在标准中发生了变化,在C90中它说:

  

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

并且不允许,因为p数组是聚合类型,但在C99中我们有:

  

具有静态的对象的初始值设定项中的所有表达式   存储持续时间应为常量表达式或字符串文字。

答案 1 :(得分:4)

这与gcc和gcc -ansi编译良好。然而,gcc -ansi -pedantic会发出以下警告:

blackjack.c: In function ‘main’:
blackjack.c:8: warning: initializer element is not computable at load time
blackjack.c:8: warning: initializer element is not computable at load time
blackjack.c:8: warning: initializer element is not computable at load time

而第8行是:

int *p[3]={a,b,c};

我认为问题在于a,b和c将存储在p中,它们还不存在。那是因为它们将被放在堆栈上,堆栈上的位置取决于函数范围之外的东西。为了澄清这一点,“加载时间”表示程序加载到内存中的时间,而不是它已经执行的时间。 (不要问我为什么/它如何运作)

答案 2 :(得分:0)

尝试: printf(“%d - %u \ n”,*(p [i]),p [i]);

虽然我有一种感觉,你想尝试做更多的事情:

int a[]={1,2,3,4,5};
int b[]={1,2,3,4,5};
int c[]={1,2,3,4,5};
int *p[3]={a,b,c};
int i;
clrscr();
for(i=0;i<sizeof(p)/sizeof(int*);i++) {
    for (int j =0; j < sizeof(a)/sizeof(int); j++) {
        printf("%d - %u\n",(p[i])[j],p[i]);
    }
}
getch();

答案 3 :(得分:0)

规则非常简单。对于静态对象,初始化列表应该是常量。对于将在堆栈上分配空间的元素,不存在这样的限制。 它似乎也是合乎逻辑的,因为静态对象需要在数据部分中编写,并且编译器必须能够事先解析它们的值。 一旦调用了有问题的函数(main),就会分配堆栈内存。所以没有问题。我不知道为什么turbo-c上会出现相反的行为。 在gcc上发生这种情况:(在使用 gcc -Wall prog.c

进行编译时
        int *p[]={a,b,c} //works fine
        static int *p[]={a,b,c} //oops blunder