2014-10-29 10 views
0

Я видел ошибку сегментации иногда во время инициализации массива с огромными размерами.Ошибка сегментации при инициализации массива

Для экс:

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

int main() 
{ 
    string h; 
    cin >> h; 
    int size=h.size(); 
    cout << size << endl; 
    int arr[size][size]; 
    cout << arr[0][0]<<endl; 
    arr[0][0]=1; 
    cout << arr[0][0]<<endl; 

return 0; 
} 

Когда пользовательский ввод небольшая строка позволяет сказать "sample" программа работает нормально.

Когда пользовательский ввод представляет собой большую строку, где размер для ex. >1500. Сегрегация видна во время инициализации массива. int arr[size][size];

В чем проблема? Есть ли проблемы при инициализации массива, как указано выше.

ответ

1

Я думаю, что вы потеряли память с этими инициализациями, вызывая переполнение стека. Я рекомендую выделить его в куче или с помощью std: vector. См. Здесь: Segmentation fault on large array sizes

0

Я думаю, что размер массива всегда должен быть константой времени компиляции в C++, то есть значение переменной 'size' должно быть известно во время компиляции.

Если вы хотите динамическое хранение, использование зОго :: вектора

0

MSDN утверждает, что размер стека по умолчанию в Windows, 1 МБ - в случае 1500 элементов в каждом измерении вашего массив будет занимать 1500 * 1500 * 4 bytes = 9000000 bytes = 8.58 megabytes, не уверен Linux (this заявляет, что это 8 МБ) - я думаю, это зависит от компилятора и дистрибутива. Так как:

1) Если вы знаете, что существует ограничение на длину строки увеличить размер стека соответственно с флагом /STACK линкера на Windows, или как писал в this ответ на Linux

2) Распределить массив на куче - если вы не хотите возиться с выделениями памяти, то std :: vector или std::unique_ptr может использоваться как контейнер

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