【问题标题】:Array of pointers problem指针数组问题
【发布时间】:2010-10-07 15:54:54
【问题描述】:

我已经尝试过这个指针数组的例子。我收到错误“函数 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();
}

如果我在数组声明中使用静态 int 而不是 int,它可以正常工作。谁能告诉我这里的静态效果。非常感谢。

【问题讨论】:

  • 哪一行产生了这个错误,你使用的是哪个编译器? VS2008 构建这个干净
  • 正确编译,在 gcc 中没有错误;你包括哪些头文件?
  • 前 3 个数组声明产生了错误。我正在使用涡轮增压器。
  • 我包括stdio和conio头文件
  • 当我看到帮助时,它说初始化必须是静态或全局变量或常量表达式的地址。

标签: c arrays pointers initialization


【解决方案1】:

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

但这显然在标准中有所改变,在 C90 中它说:

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

这是不允许的,因为 p 数组是一个聚合类型,但在 C99 中我们有:

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

【讨论】:

  • 你引用的规则在这里不适用。 p 没有静态存储持续时间。
【解决方案2】:

使用 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 中,它们还不存在。那是因为它们将被放在堆栈上,而堆栈上的位置取决于函数范围之外的东西。为了澄清这一点,“加载时间”是指程序加载到内存中的时间,而不是它已经在执行的时间。 (无论如何不要问我为什么/如何工作)

【讨论】:

    【解决方案3】:

    尝试: 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();
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-17
        • 2013-03-25
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多