c 定義全域性陣列,當陣列很大時,位址是不連續的嗎

時間 2021-06-02 18:59:42

1樓:

不對,C++中定義的陣列,在記憶體分配上都是分配一塊連續的記憶體來儲存的,這個是不用懷疑的。

問題分析:

C++中,陣列在記憶體中的分配有靜態分配和動態分配兩種。靜態陣列建立的方式為:A a,它在棧上分配空間;動態陣列建立的方式是使用new 或 malloc在堆上分配。

靜態分配

intarr[10

];intarr

=;動態分配

//一維陣列

int*

arr=

(int*)

malloc

(sizeof

(int)*

size

);//row 和 col 可以由使用者輸入

int**

array=(

int**

)malloc

(sizeof

(int)*

row);

for(i=

0;i

)array[i

]=(int*)

malloc

(sizeof

(int)*

col);

靜態分配時,資料儲存在棧(函式中使用陣列)上或靜態儲存區(全域性陣列);動態分配時,資料儲存在堆上。C++中,在函式(包括main函式)中,記憶體為棧所分配的最大空間為4M,當然不同系統有可能不同。

你在程式中定義的是全域性陣列,陣列容量是相當龐大,很可能是儲存區溢位了,也就是說沒有找到這樣一塊連續的記憶體區域來儲存這些資料,從而用lower-bound()操作時出錯。你可以試著減少資料量來試一下是否恢復正常。

解決方法:

1.可以採用多個陣列vector的方式來分別定義進行儲存。示例如下:

vector

>vec0

;vector

>vec1

;vector

vec2

;vector

>vec3

;//注意max_size()函式返回的是vector容器最大能存放的元素的個數,並不是位元組數

cout

<

.max_size

()<<

endl

;cout

<

.max_size

()<<

endl

;cout

<

.max_size

()<<

endl

;cout

<

.max_size

()<<

endl

;在程式執行完之後得到的資料如下(win7系統 64位 VS2010下):

vec0 時為4294967295,即4G個元素

vec1 時為134217727,即128M個元素

vec2 時為1073741823,即1G個元素

vec3 時為536870911,即512M個元素

注意:雖然上面顯示了可以存放這麼多數量的元素個數,但是一般情況下並不會真的讓你存放這麼多的資料。

2.可以使用list鍊表來實現,鍊表儲存是非連續的。例如可以用list arr;這種方式儲存資料,只要記憶體滿足,都是可以儲存的。

C 中如何建立乙個不定長陣列的陣列指標?

按照 C 的寫法應該是 int p 4 但是既然是用 C 最好的方法還是用模板容器 using arr type std vector array 4 arr typep1 arr typep2 arr typep3 arr typep4 arr typep5 然後想要拷貝 std vector p...

為什麼c 中陣列不能直接拷貝給另一陣列?

d41d8c 結構體的拷貝建構函式中,陣列可以拷貝。lambda的拷貝捕獲可以捕獲陣列 int a 2 a structured binding也可以產生陣列的拷貝 int a 2 auto x,y a 中,x和y繫結到a的副本中的元素。甚至char a asdf 這種初始化也可以看作陣列拷貝的特例...

C語言陣列定義時不初始化為什麼會報錯?

陌歸 a i 代表一維陣列中下標為i的元素。假如你定義了乙個a 5 呼叫的時候用的a 5 是越界訪問的下標為5的元素 因為事實上陣列a 5 的下標值只到4 不是整個陣列。只有在定義的時候a代表陣列。 薛非 先定義int ages 5 或int ages 再乙個乙個賦值是可以的,這不可能。請如實描述問...