переполнение стека нарушения прав доступа c ++ - PullRequest
0 голосов
/ 28 октября 2018

каждый ...

Я очень новичок в C ++ ... Моя проблема заключается в чтении большого текстового файла в C ++ visual Studio 2012 ...

Вот мой простойкод:

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

int main() {
    double x;
    int i,j;
    ifstream inFile;
    i=0;
    j=0;



 double x_array[800050][1] ;

    x = 0;
    inFile.open("D:\\a.txt");
    if (!inFile) {
        cout << "Unable to open file";
        exit(1); // terminate with error
    }

    while (inFile >> x) {

                         x_array[i][0]=x;
                         i++;

    }

    inFile.close();
    return 0;
}

Но когда я отлаживаю код, я сталкиваюсь с этой ошибкой:

Необработанное исключение в 0x01242327 в textreader.exe: 0xC00000FD: переполнение стека (параметры:0x00000000, 0x00E42000).

Когда я уменьшаю размер входного текстового файла (уменьшая входной номер), проблема решается ... Но мне нужен весь входной текстовый файл ...

Что мне делать?Проблема в коде или я должен найти лучший способ?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Автоматические переменные обычно помещаются в стек вызовов.Размер стека вызовов по умолчанию на большинстве настольных систем составляет от одного до нескольких мегабайт.Размер double [800050][1] превышает шесть мегабайт (при условии, что размер double равен восьми байтам).Результат использования такой огромной автоматической переменной приводит к переполнению стека , как вы заметили.

Не используйте автоматические переменные для больших объектов.Вместо этого вы можете динамически размещать объект.В этом случае вы можете использовать std::vector<double>.

Другая проблема заключается в том, что вы жестко закодировали размер массива, и, следовательно, вы рискуете переполнить массив, даже если он уместился в стеке.Когда вы используете std::vector, вы можете позволить ему динамически расти вместо жесткого кодирования размера.

0 голосов
/ 28 октября 2018

вы (как упоминалось в ошибке) переполняете стек при выделении:

  double x_array[800050][1] ;

вы должны попытаться выделить его в куче (напрямую используя new или косвенно используя контейнер std, такой как std:: вектор)

...