【问题标题】:Segmentation fault block分段故障块
【发布时间】:2018-02-07 16:51:41
【问题描述】:
FILE *fp;

fp = fopen(filen, "wb");

const char tok[2] = ",";
char str[340];

while (fgets(str, 340, stdin) != NULL)
{
  struct test loadTest;
  printf("You entered: %s", str);
  strncpy(loadTest.level, strtok(str, tok), 20);
  strncpy(loadTest.first, strtok(NULL, tok), 30);
  fwrite(&loadTest, sizeof(struct test), 1, fp);
}

fclose(fp);

大家好,

由于某种原因,我的代码中出现分段错误错误。

我几乎可以肯定错误是在上面的小代码块中的某个地方(因为这是我为 seg 错误修改的全部内容),但我似乎无法确定它。

我知道分段错误与访问我不应该访问的内存有关,但我什至不确定我在代码中的哪个位置。

任何帮助将不胜感激!

【问题讨论】:

  • 你试过调试代码吗?
  • 您确定令牌的长度固定为指定的 20 和 30?
  • 您的调试器会告诉您段错误发生的确切位置。用它。如果您不知道如何使用调试器,那么现在可能是开始学习的好时机。另请阅读:minimal reproducible example。并且不要使用strncpy,目标字符串可能不是NUL终止的,阅读this
  • 显示整个代码,而不仅仅是一部分。 filen 是什么?它被初始化了吗?为什么不检查文件是否打开且没有错误? if (fp == NULL) return; 99% 你还没有打开文件,fp 为 NULL。

标签: c segmentation-fault


【解决方案1】:

你的代码的一些改进

  • 在读/写文件之前检查fopen的结果
  • 在使用变量值之前初始化变量
  • 使用 sizeof 代替常量(如 cmets 中所述)
  • strtok() 可以返回 NULL,这必须检查(请参阅 here 为什么)
  • 你必须小心使用strncpy(),因为this

这是您的代码的更正版本

FILE *fp;

fp = fopen(filen, "wb");

if (fp == NULL) 
{
    printf("Error opening file: %s", filen);
}
else
{

    const char tok[2] = ",";
    char str[340];

    while (fgets(str, sizeof(str), stdin) != NULL)
    {
        struct test loadTest;
        char *level;
        char *first;
        memset(&loadTest, 0, sizeof(loadTest)); 
        printf("You entered: %s", str);
        level = strtok(str, tok);
        if (level == NULL)
        {
            continue; // bad input ?
        }
        first  = strtok(NULL, tok);
        if (first == NULL)
        {
            continue;
        }
        strncpy(loadTest.level, level, sizeof(loadTest.level)-sizeof(char));
        strncpy(loadTest.first, first, sizeof(loadTest.first)-sizeof(char));
        fwrite(&loadTest, sizeof(loadTest), 1, fp);
    }

    fclose(fp);
}

【讨论】:

  • 这些是改进,但认为它们不会阻止 seg 错误。发表评论。
  • @i486 我需要发表什么评论?在发布答案之前,我已经对问题添加了评论。我认为出现段错误是因为文件未成功打开。 fpfopen 之后为 NULL。
  • 你只能怀疑fopen是问题所在。这不是 100% 确定 => 解决方案是用于评论,它不是答案。
  • @i486 如果不查看整个代码,我无法 100% 确定。只有 OP 可以告诉他为什么会出现段错误。感谢您的意见,但发布后我无法删除答案。
猜你喜欢
  • 2018-01-19
  • 1970-01-01
  • 2016-09-09
相关资源
最近更新 更多