2013-04-29 102 views
1

我想不出有什麼用下面的代碼的問題崩潰,它只是崩潰而不outputing任何內容到屏幕上:C++程序與結構聲明數組

#include <cstdlib> 
#include <iostream> 
using namespace std; 

typedef struct { 
    unsigned int recid; 
    unsigned int num; 
    char str[120]; 
    bool valid; 
} record_t; 

typedef struct { 
    unsigned int blockid; 
    unsigned int nreserved; 
    record_t entries[100]; 
    bool valid; 
    unsigned char misc; 
} block_t; 

int main(){ 
    cout << "Before Buffer" << endl; 
    block_t buffer[1000]; 
    cout << "After Buffer" << endl; 
    return 0; 
} 

我試圖Qt的調試器和GBD和他們只顯示分段故障並指向主功能的開始。

每個block_t元素的大小爲13.2 Kbs,所以緩衝區數組的大小應該在13Mb左右。也許這對C陣列來說太過分了?

+0

如果你認爲它是數組的大小,那麼你有沒有嘗試過更小的尺寸? – 2013-04-29 01:57:53

+0

我應該對100GB數據進行外部排序,只是給出這個緩衝區我不認爲我不能存儲它13MB的內存......我一定是缺少...... – 2013-04-29 02:01:41

+1

你的數組可能比你的堆棧大空間。使用堆空間(例如'block_t ** b =(block_t **)malloc(sizeof(block_t)* 1000);')。 – 2013-04-29 02:03:16

回答

3
block_t buffer[1000]; 
可能使用你所有的堆棧空間

(要求大於1000 * 100 * 120 * 1字節假設ASCII約等於12MB,不考慮那些結構等領域),因此,你會得到一個分段錯誤。

嘗試使用:

block_t * buffer = new block_t[1000]; 

std::vector代替或者如果可能增加您的棧空間更大的尺寸。

+0

謝謝不知道除了能夠在運行時分配以外,這兩個有很大的區別 – 2013-04-29 02:19:23

+0

@ParisP不客氣 – taocp 2013-04-29 02:22:01

2

您的buffer變量大約爲13MB - 對於堆棧分配太大。