c中全局声明的数组的大小是多少?

时间:2013-04-17 13:31:52

标签: c arrays

#include <stdio.h>

char A[];

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

}

我可以使用索引访问任何元素。它永远不会出错。我可以访问32位机器的最大元素索引是什么?

5 个答案:

答案 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)

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