分段故障块

时间:2017-08-30 05:27:16

标签: c segmentation-fault

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故障修改的所有内容),但我似乎无法确定它。

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

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:-1)

代码的一些改进

  • 在读取/写入文件
  • 之前检查fopen的结果
  • 在使用值之前初始化变量
  • 使用sizeof代替常量(如评论中所述)
  • strtok()可以返回NULL并且必须检查(请参阅here原因)
  • 由于this
  • ,您必须谨慎使用strncpy()

以下是您的代码的更正版本

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);
}