-1
#include <stdio.h>

char A[];

int main()
{
    printf("%c\n",A[1]);
    return 0;

}

我可以使用 index 访问任何元素。它从不出错。对于 32 位机器,我可以访问的最大元素的索引是多少?

4

5 回答 5

3

当声明char A[];出现在文件范围内时,它声明了一个数组。数组的定义应该出现在其他地方。如果定义没有出现在同一个文件(翻译单元)中,那么行为就像一个定义出现了一个值为 0 的初始值设定项,就好像你写了char A[] = { 0 };.

声明可见的代码可以使用数组。但是,如果数组的定义不可见,则编译器不知道数组的大小。代码作者有责任仅使用实际定义的元素。他们必须通过事先安排或在程序中传递一些信息来知道数组的大小。

如果代码使用了一个不存在的数组元素,或者甚至计算了一个元素的地址超过数组末尾的一个以上,那么行为是未定义的。

于 2013-04-17T13:39:14.310 回答
3

它的大小为 1。超出索引 0 的访问(包括访问的代码A[1])具有未定义的行为。

这是 C99 标准中的 6.9.2。char A[];是一个“暂定定义”,粗略地说,如果同一个翻译单元包含一个正确的定义,那么它只是一个A未知大小的 char 数组的声明。如果没有正确的定义,那么无论如何都会定义对象,就好像在翻译单元的末尾有一个定义一样,带有一个默认的初始化程序。

于 2013-04-17T13:41:02.610 回答
2

A[1]将被翻译为*(A+1)基本上是一个内存地址。因此,printf可以打印该内存位置的任何内容。我假设您可以继续引用该数组,直到该位置存在任何内容(这会给您带来垃圾)[并且您被允许访问该位置]。

编辑: GCC 4.6.3给出warning: array ‘A’ assumed to have one element [enabled by default]

于 2013-04-17T13:34:51.820 回答
0

我可以使用 index 访问任何元素。它从不出错。对于 32 位机器,我可以访问的最大元素的索引是多少?

在 C 中你可以做很多你不应该做的事情。访问数组的越界元素通常就是其中之一。

当我使用 gcc 编译您的代码时,我得到:

warning: array ‘A’ assumed to have one element

这应该足以告诉您不应该访问除A[0].

于 2013-04-17T13:54:26.007 回答
-1

它只是一个指针,表中没有元素。你不应该尝试索引任何东西。

于 2013-04-17T13:34:13.660 回答