所有
这一直困扰着我一段时间。在C \ C ++中(我猜java和.NET)我们不必在多维数组中指定行索引。 所以,例如我可以声明一个int数组:
int Array [] [100];
我认为静态数组通常表示为堆栈上的连续内存。因此,采用列主要表示形式,编译器如何知道在上述情况下要分配多少内存,因为它缺少其中一个维度?
答案 0 :(得分: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 ++中的情况也没有太大区别:在这些语言中定义不完整类型的对象是非法的,而未指定大小的数组是不完整的类型。
答案 1 :(得分: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];
,因为它警告你它正在做。
答案 2 :(得分:1)
它不知道要分配多少内存,他对array[]
的了解是该数组是一个指针(如int *array
)。 array[][100]
(如果我错了,请有人纠正我)与array[100]
相同。