2016-09-28 3 views
-1

ファイルからデータを読み込むプログラムを開発していて、一定のサイズの文字列を作成しようとしたときにSegフォルトが発生しました。文字列作成時のセグメンテーションフォルト

FILE *in = fopen("entrada.txt", "r"); 

t_mapa *mapa; 
t_jogador *jogadores; 
jogadores = NULL; 

int i, num_jogadores, tamanho_mapa; 
char *token1, *token2; 
char str1[4], str2[4]; //RIGHT HERE WHEN I CREATE THE STRING, I RECEIVE A SEG FAULT 

if(in == NULL){ 
    printf("Arquivo Não pode ser aberto"); 
} 


fscanf(in, "%d", &tamanho_mapa); 
printf("%d\n", tamanho_mapa); //Debugger 
mapa->mapa = cria_mapa(tamanho_mapa); 
preenche_mapa(mapa, in, tamanho_mapa); 
fscanf(in, "%d", &num_jogadores); 
printf("%d %p\n", num_jogadores, jogadores); //Debugger 
jogadores = cria_jogadores(num_jogadores); 


for(i=0; i<num_jogadores; i++){ 
    fscanf(in, "%s %s", str1, str2); 
    token1 = strtok(str2, ","); 
    token2 = strtok(NULL, ","); 
    jogadores[i].linha = atoi(token1); 
    jogadores[i].coluna = atoi(token2); 
} 
+0

クラッシュがどこにあるのか、どのように分かりますか?なぜなら、スタックオーバーフロー(セグメンテーションフォルトとして現れない)を除いて、クラッシュする可能性のないコードだからです。デバッガを使用して実際の動作を把握し、コード内のどこに*本当に*発生しているかを確認してください。 –

+1

私はエラーについて2つの推測を持っています: 'strtok'呼び出しのいずれかが' NULL'ポインタを返します(これはチェックしません)。あるいは、Cの文字列に '\ 0 'を終端させるための余分な文字が必要であることを忘れてしまい、配列の境界から書き出すことになります。第3の理由は、 'cria_jogadores'がメモリの割り当てに失敗したり、アロカル配列へのポインタを返したりするためです。 –

+0

'char str1 [4]、str2 [4];' 2つのトークンを含むファイル文字列から読みやすくするために些細なことです。これは、「a、b」などの3文字の文字列の形で入力することを意味します。 –

答えて

1

は、だから私は別の理論を持って、私は次の行が、ここで与えられたコードのように、あなたは

t_mapa *mapa; 

このような mapaを定義している場合にのみ、犯人

mapa->mapa = cria_mapa(tamanho_mapa); 

だと思います

これは何も初期化していないようですが、->演算子を使用して逆参照してください。

これ以外には何も間違ったことはありません。より良い答えを出すためには、より多くのコードが必要になります。

関連する問題