2014-09-26 57 views
-3

我這樣編碼,但它得到seg-fault。在C++中使用指針陣列

出了什麼問題?

int vector_size = 100000000; 

float *rows[vector_size]; 

for (int i=0; i<vector_size; i++) { 
    rows[i] = (float *)malloc(sizeof(float)*2); // crashed here 
    // ... 
} 
+4

您的系統的內存溢出可能嗎? – 2014-09-26 08:27:03

+3

您嘗試創建一個幾乎爲400MB的數組(在32位系統上,在64位系統上爲double))。如果將數組聲明爲局部變量,則超出了任何系統的堆棧大小(請記住,大多數(所有?)編譯器都將局部變量存儲在堆棧中,並且堆棧通常位於單位數字MB範圍內) 。 – 2014-09-26 08:28:29

+1

墜毀在我的價值?你有沒有注意到你的系統的堆棧大小限制? – Jepessen 2014-09-26 08:29:39

回答

1

您正試圖分配大量的內存。如果你真的需要這麼多的浮點數,爲每個浮點數使用一個單獨的malloc可能是一個糟糕的計劃。 Malloc有它自己的開銷,因爲有一個可以分配的最小塊大小,並且內存管理器也需要跟蹤所有那些單獨分配的內存區域,更不用說這個指針列表的大小。

一個更好的解決方案可能是在所有彩車單塊足夠的空間來分配,而該指數作爲一個數組,而不是儘量保持指針列表...

所以...

float *rows = malloc(sizeof(float) * vector_size); 

可能是一個更好的起點。

+0

謝謝,我太愚蠢了:) – JaycePark 2014-09-26 08:45:25

0

嘗試分配內存不在堆棧中,但在堆中。

float **rows = new float*[vector_size]; 

你會得到什麼樣的消息?

它看上去並不像內存溢出,因爲如果內存結束的malloc()返回NULL:\

附:對不起,我的英語)

upd。哦,我沒有看到上面的評論