没有维度的全局整数数组

use*_*982 6 c arrays global

定义没有维度的全局数组时的概念是什么?这表示输出为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;
    }
Run Code Online (Sandbox Code Playgroud)

甚至sizeof(arr)都不起作用.为什么?

Dan*_*her 12

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

第6.9.2条第2款规定:

具有没有初始化程序的文件范围且没有存储类说明符或存储类说明符为静态的对象的标识符声明构成暂定定义.如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,那么行为就像翻译单元包含该标识符的文件范围声明一样,复合类型为翻译单元的结尾,初始化程序等于0.

该条第5款中的例子2澄清:

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

   int i[];
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • +1表示如何回答基本上任何有关C实现的问题:*阅读[精细]标准!* (2认同)