Вопрос

Я пишу программу, которая будет считывать строки из infile, используя getline, в строки, преобразовывать строки в c-строки, содержащие первые m небелых символов строки, затем объединять c-строки в один массив символов.

Пример файла может выглядеть примерно так:

5    //number of rows and columns in a grid
2    //number of grids
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX

XXXXX
XXXXX
XXXXX
XXXXX
XXXXX

Таким образом, в итоге я бы получил массив символов размером 2x5x5 символов.Теперь проблема в том, что мой код отлично работает на небольших тестовых примерах, подобных показанному выше, но при попытке сегментации на больших сетках возникают ошибки (т. е.100x100x100).

#include <iostream>
#include <string>
using namespace std;
int main(){
  int mapsize,levels;
  cin>>mapsize;
  cin>>levels;
  char map[mapsize*mapsize*levels];
  string input;
  for (int i=0;i<levels;i++){
    for (int j=0;j<mapsize;j++){
      getline(cin,input);
      char *row;
      row=new char[input.size()+1];
      strcpy(row, input.c_str());
      for (int k=0;k<mapsize;k++){
        map[i*mapsize*mapsize+j*mapsize+k]=row[k];
      }
      delete [] row;
    }
  }
return 0;
}

Я бы назвал эту программу с инфайлом:./программа < infile.in

Я запустил его с помощью gdb и выполнил обратную трассировку.Он всегда указывает на строку "строковый ввод";

Есть какие-нибудь идеи, как я могу устранить этот сбой сегмента?Спасибо

Это было полезно?

Решение

map это VLA, выделенный в стеке, так что я бы предположил, что ваша проблема в том, что вы получаете переполнение стека.gdb указывает на построение input потому что это первое, что создается в этом переполненном стеке.

Другие советы

Я не уверен, почему обратный путь указывает на string input; но когда вы копируете row в map.если mapsize больше размера строки, вы вполне можете столкнуться с ошибкой в сегменте.Это будет более характерно для большего размера карты.

вы также вполне можете перепутать адреса возврата в стеке, что может привести к "неправильному" дампу ядра.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top