2013-04-29 3 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

Если вы считаете, что это размер массива, вы попробовали меньшие размеры? –

+0

Я должен делать внешнюю сортировку по данным на 100 ГБ, учитывая только этот буфер, я не думал, что не смогу хранить даже 13 МБ в нем ... Мне, должно быть, не хватает ... –

+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

Спасибо, что не знали, что эти 2 имели такую ​​большую разницу, кроме возможности выделить во время выполнения –

+0

@ParisP. Добро пожаловать – taocp

2

Ваша переменная buffer составляет около 13 МБ - слишком большая для распределения стека.

Смежные вопросы