2016-09-28 35 views
-1

我一直在开发一个程序来读取文件中的数据,然后当我尝试创建一个恒定大小的字符串时,我收到了Seg Fault。字符串创建时的分段错误

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

我有两个关于错误的猜测,但是:任何一个'strtok'调用都会返回一个'NULL'指针(你不检查)。或者你忘记了C中的字符串需要一个额外的字符来终止''\ 0',并且你写出了数组的边界。第三个原因可能是'cria_jogadores'未能分配内存,或者返回一个指向本地数组的指针。 –

+0

'char str1 [4],str2 [4];'从包含两个令牌的文件字符串中读取时看起来很小。这意味着输入为3字符串,如“a,b” –

回答

1

所以我有不同的理论,我认为下一行是罪魁祸首

mapa->mapa = cria_mapa(tamanho_mapa); 

也就是说只有当像在这里给出的代码,你定义mapa这样

t_mapa *mapa; 

您似乎没有初始化它,但是使用->运算符对其进行了解引用。

除此之外,我没有看到任何直接的错误。我们需要更多的代码才能给出更好的答案。