6

当我们定义一个没有维度的全局数组时是什么概念这显示输出为16。

    #include <stdio.h>
    #include <stdlib.h>
    int arr[];

    int main(int argc, char *argv[])
    {
        arr[1] = 16;

      printf("%d\n",arr[1]);
      system("PAUSE");  
      return 0;
    }

甚至 sizeof(arr) 也不起作用。为什么?

4

2 回答 2

12

int arr[];是一个暂定的定义

第 6.9.2 条第 2 款说:

具有文件范围的对象的标识符声明没有初始化程序,并且没有存储类说明符或具有存储类说明符 static,构成暂定定义如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,则行为与翻译单元包含该标识符的文件范围声明完全相同,复合类型为翻译单元的末尾,初始化器等于0.

该条款第 5 段中的示例 2 阐明:

如果在翻译单元的末尾包含

   int i[];

该数组i仍然具有不完整的类型,隐式初始化程序使其具有一个元素,该元素在程序启动时设置为零。

所以在翻译单元的末尾,你的数组arr有 type int[1]。在结束之前,它的类型不完整,因此sizeof不起作用,因为在 中main,数组类型仍然不完整。

访问arr[1]调用未定义的行为,因为arr只有一个元素。

于 2013-06-21T19:28:13.730 回答
1

GCC 假设arr应该只有一个元素。您可以访问其他元素而不是没有段错误的事实arr[0]只是一个巧合。例如,在我的机器上我可以访问arr[1]arr[10]并且arr[100]很好,但arr[1000]会导致段错误。通常,访问数组边界之外的位置会导致未定义的行为

于 2013-06-21T19:28:41.160 回答