没有维度的全局整数数组
当我们定义没有维度的全局数组时,这个概念是什么?这表示输出为16。
#include #include int arr[]; int main(int argc, char *argv[]) { arr[1] = 16; printf("%d\n",arr[1]); system("PAUSE"); return 0; }
甚至sizeof(arr)都不起作用。 为什么?
int arr[];
这是一个暂定的定义 。
第6.9.2条第2款规定:
具有文件范围而没有初始化程序且没有存储类说明符或存储类说明符为静态的对象的标识符声明构成暂定定义 。 如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,那么行为就像翻译单元包含该标识符的文件范围声明一样,复合类型为翻译单元的结尾,初始化程序等于
0
。
该条第5款中的例子2澄清:
如果在翻译单元的末尾包含
int i[];
数组
i
仍然有不完整的类型,隐式初始化器使它有一个元素,在程序启动时设置为零。
所以在翻译单元的末尾 ,你的数组arr
类型为int[1]
。 在结束之前,它的类型是不完整的,因此sizeof
不起作用,因为在main
,数组类型仍然不完整。
访问arr[1]
调用未定义的行为,因为arr
只有一个元素。
GCC假设arr
应该只有一个元素。 您可以访问除arr[0]
之外的其他元素而不进行segfaulting这一事实只是巧合。 例如,在我的机器上,我可以访问arr[1]
, arr[10]
和arr[100]
就好了,但是arr[1000]
会导致段错误。 通常,访问数组边界外的位置会导致未定义的行为 。