簡體   English   中英

如何為靜態多維數組分配內存?

[英]How is memory allocated for a static multi-dimensional array?

所有,

這一直困擾着我一段時間。 在C \\ C ++中(我猜java和.NET)我們不必在多維數組中指定行索引。 所以,例如我可以聲明一個int數組:

int Array [] [100];

我認為靜態數組通常表示為堆棧上的連續內存。 因此,采用列主要表示形式,編譯器如何知道在上述情況下要分配多少內存,因為它缺少其中一個維度?

用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 ++中的情況並沒有太大的不同:在這些語言中定義不完整類型的對象是非法的,而未指定大小的數組是不完整的類型。

在java和.NET中,不要考慮“堆棧” - 對象存在於堆上。 在C中,這只是一個聲明 - 只有一個定義實際上保留了內存! 所以這不是一個可接受的定義 - 如果你把它作為文件ac的唯一行:

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

所以gcc只是將它視為int Array[1][100]; ,因為它警告你它正在做。

它不知道要分配多少內存,他對array[]是數組是一個指針(如int *array )。 array[][100] (有人請糾正我,如果我錯了)與array[100]相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM