定义没有维度的全局数组时的概念是什么 这显示输出为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)都不起作用。为什么呢?
答案 0 :(得分:12)
int arr[];
是一个暂定定义。
第6.9.2条第2款说:
具有没有初始化程序的文件范围且没有存储类说明符或存储类说明符为静态的对象的标识符声明构成暂定定义。 如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,则行为就像翻译单元包含该标识符的文件范围声明一样,复合类型截至翻译单元末尾,初始化程序等于
0
。
和该条第5款中的例子2澄清:
如果在包含
的翻译单元的末尾int i[];
数组
i
仍然具有不完整的类型,隐式初始化器使其具有一个元素,在程序启动时将其设置为零。
在翻译单元末尾的 ,您的数组arr
的类型为int[1]
。在结束之前,它的类型不完整,因此sizeof
不起作用,因为在main
中,数组类型仍然不完整。
访问arr[1]
会调用未定义的行为,因为arr
只有一个元素。
答案 1 :(得分:1)
GCC假设arr
应该只有一个元素。您可以在没有segfaulting的情况下访问除arr[0]
之外的其他元素这一事实只是巧合。例如,在我的计算机上,我可以访问arr[1]
,arr[10]
和arr[100]
,但arr[1000]
会导致段错误。通常,访问数组边界外的位置会导致未定义的行为。