【问题标题】:Segmentation Fault on String Creation [closed]字符串创建的分段错误[关闭]
【发布时间】:2016-09-28 17:37:55
【问题描述】:

我一直在开发一个程序来从文件中读取数据,然后当我尝试创建一个恒定大小的字符串时收到了 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);
}

【问题讨论】:

  • 你怎么知道那是崩溃的地方?因为除非您有堆栈溢出(并且不会表现为分段错误),否则这是不会导致崩溃的代码。请使用调试器来捕捉正在运行的崩溃,并找出它在代码中真正发生的位置。
  • 我对这个错误有两种猜测:strtok 调用中的任何一个都返回一个NULL 指针(您不检查它)。或者你忘记了 C 中的字符串需要一个额外的字符来终止 '\0',并且你写的超出了数组的范围。第三个原因可能是cria_jogadores 分配内存失败,或者返回了一个指向非本地数组的指针。
  • char str1[4], str2[4]; 从包含两个标记的文件字符串中读取看起来非常小。这意味着以 3 字符字符串的形式输入,例如 "a,b"
  • 如果 segfault 发生在您评论的地方,那么损坏之前发生在程序的其他地方。
  • 请展示一个完整且最小的示例来说明您的问题。 “完整”是指您应该显示整个main.c 文件。 “最小”是指您应该删除所有不会导致问题的内容。

标签: c string segmentation-fault


【解决方案1】:

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

mapa->mapa = cria_mapa(tamanho_mapa);

只有在此处给出的代码中,您才像这样定义 mapa

t_mapa *mapa;

您似乎没有将其初始化为任何内容,但随后使用 -&gt; 运算符取消引用它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多