Pergunta

Estou escrevendo um programa que lerá linhas de um infil a usar o GETLINE em strings, converter as cordas em strings C contendo os primeiros caracteres de espaço que não são do espaço M da string e depois concatenar as cordas C em uma única matriz de char.

Um arquivo de amostra pode parecer algo assim:

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

XXXXX
XXXXX
XXXXX
XXXXX
XXXXX

Então, eu acabaria com uma matriz de char de caracteres 2x5x5.Agora, o problema é que o meu código funciona bem em casos de teste menores, como o mostrado acima, mas as falhas de segmentação quando eu o tento em grades maiores (ou seja, 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;
}

Eu chamaria esse programa com um infil: ./program <infile.in

Eu o executei usando o GDB e fiz backtrace. Ele sempre aponta para a linha "String input;"

Alguma idéia de como posso resolver este segfault? Obrigado

Foi útil?

Solução

map é um VLA, alocado na pilha, então eu acho que o seu problema é que você obtém um transbordamento de pilha. GDB aponta a construção de input Porque essa é a primeira coisa que é construída nessa pilha transbordada.

Outras dicas

Não sei por que o backtrace está apontando para string input; Mas quando você está copiando row em map. Se o Mapsize for maior que o tamanho da linha, você poderá acabar com a falha de Seg. Isso será mais comum para um mapsize maior.

Você também pode estar pisando em endereços de retorno na pilha que podem estar causando o dump "errado".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top