如何为静态多维数组分配内存?

时间:2009-12-01 04:12:25

标签: c++ c memory multidimensional-array allocation

所有

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

int Array [] [100];

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

3 个答案:

答案 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]相同。