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