#include <stdio.h>
char A[];
int main()
{
printf("%c\n",A[1]);
return 0;
}
我可以使用 index 访问任何元素。它从不出错。对于 32 位机器,我可以访问的最大元素的索引是多少?
当声明char A[];
出现在文件范围内时,它声明了一个数组。数组的定义应该出现在其他地方。如果定义没有出现在同一个文件(翻译单元)中,那么行为就像一个定义出现了一个值为 0 的初始值设定项,就好像你写了char A[] = { 0 };
.
声明可见的代码可以使用数组。但是,如果数组的定义不可见,则编译器不知道数组的大小。代码作者有责任仅使用实际定义的元素。他们必须通过事先安排或在程序中传递一些信息来知道数组的大小。
如果代码使用了一个不存在的数组元素,或者甚至计算了一个元素的地址超过数组末尾的一个以上,那么行为是未定义的。
它的大小为 1。超出索引 0 的访问(包括访问的代码A[1]
)具有未定义的行为。
这是 C99 标准中的 6.9.2。char A[];
是一个“暂定定义”,粗略地说,如果同一个翻译单元包含一个正确的定义,那么它只是一个A
未知大小的 char 数组的声明。如果没有正确的定义,那么无论如何都会定义对象,就好像在翻译单元的末尾有一个定义一样,带有一个默认的初始化程序。
A[1]
将被翻译为*(A+1)
基本上是一个内存地址。因此,printf
可以打印该内存位置的任何内容。我假设您可以继续引用该数组,直到该位置存在任何内容(这会给您带来垃圾)[并且您被允许访问该位置]。
编辑: GCC 4.6.3给出warning: array ‘A’ assumed to have one element [enabled by default]
我可以使用 index 访问任何元素。它从不出错。对于 32 位机器,我可以访问的最大元素的索引是多少?
在 C 中你可以做很多你不应该做的事情。访问数组的越界元素通常就是其中之一。
当我使用 gcc 编译您的代码时,我得到:
warning: array ‘A’ assumed to have one element
这应该足以告诉您不应该访问除A[0]
.
它只是一个指针,表中没有元素。你不应该尝试索引任何东西。