1

全部,

这一直困扰着我一段时间。在 C\C++(我猜 java 和 .NET 也是如此)中,我们不必在多维数组中指定行索引。因此,例如,我可以这样声明一个整数数组:

整数数组[][100];

我认为静态数组通常表示为堆栈上的连续内存。那么,以列为主表示,编译器如何知道在上述情况下要分配多少内存,因为它缺少一个维度?

4

3 回答 3

2

在 C++ 语言中,你不能只做

int Array[][100]; /* ERROR: incomplete type */

因为这将是一个不完整类型对象的定义,这在 C++ 中是明确非法的。您可以在非定义声明中使用它

extern int Array[][100];

(或作为类的静态成员),但是当涉及到同一个数组对象的实际定义时,必须显式指定两个大小(或从显式初始化器派生)。

在 C 中,情况并没有太大的不同,除了在 C 中存在诸如临时定义之类的东西,可以让您编写

int Array[][100];

但是,在这方面的暂定定义与非定义声明非常相似,这就是允许它的原因。最终,您将不得不在同一翻译单元中定义具有明确指定大小的同一对象(某些编译器不要求将其作为非标准扩展名)。如果你在非暂定定义中尝试类似的东西,你会得到一个错误

static int Array[][100]; /* ERROR: incomplete type */

因此,如果您考虑一下,除了暂定定义之外,C 和 C++ 中的情况并没有太大不同:在这些语言中定义不完整类型的对象是非法的,并且未指定大小的数组是不完整类型。

于 2009-12-01T07:02:59.420 回答
1

在 java 和 .NET 中,不要考虑“堆栈”——对象位于堆上。而在 C 语言中,这只是一个声明——只有一个定义实际上保留了内存!所以这不是一个可接受的定义——如果你把它作为文件中的唯一行a.c

$ gcc -c a.c
a.c:1: warning: array ‘Array’ assumed to have one element

所以 gcc 只是把它当作是int Array[1][100];,因为它警告你它正在做的事情。

于 2009-12-01T04:19:50.030 回答
1

它不知道要分配多少内存,他所知道的array[]是数组是一个指针(如int *array)。array[][100](如果我错了,请有人纠正我)是一样的array[100]

于 2009-12-01T04:20:16.610 回答