Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分段断块_C_Segmentation Fault - Fatal编程技术网

C 分段断块

C 分段断块,c,segmentation-fault,C,Segmentation Fault,大家好, 由于某种原因,我的代码中出现了一个分段错误 我几乎可以肯定错误在上面的小代码块中的某个地方,因为这是我为seg故障修改的全部内容,但我似乎无法确定它 我知道分段错误与访问我不应该访问的内存有关,但我甚至不确定我在代码中做了什么 任何帮助都将不胜感激 代码的一些改进 读取/写入文件前检查fopen的结果 在使用变量值之前初始化变量 使用sizeof而不是注释中提到的常量 strtok可以返回NULL,必须对此进行检查,查看原因 您必须小心使用strncpy,因为 这是您的代码的更正版本

大家好,

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

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

我知道分段错误与访问我不应该访问的内存有关,但我甚至不确定我在代码中做了什么


任何帮助都将不胜感激

代码的一些改进

读取/写入文件前检查fopen的结果 在使用变量值之前初始化变量 使用sizeof而不是注释中提到的常量 strtok可以返回NULL,必须对此进行检查,查看原因 您必须小心使用strncpy,因为 这是您的代码的更正版本

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

您是否尝试调试代码?是否确定令牌的长度已固定为指定的20和30?调试器将告诉您SEGFULT发生的确切位置。使用它。如果您不知道如何使用调试器,那么现在可能是开始学习的好时机。请同时阅读以下内容:。不要使用strncpy,目标字符串可能不会以NUL结尾,请阅读并显示整个代码,而不仅仅是一部分。什么是文件?它是否已初始化?为什么不检查文件是否正确打开?如果fp==NULL返回;99%的用户表示您尚未打开文件且fp为空。请提供一个。这些都是改进,但不认为它们会停止seg故障。发表评论。@i486我需要发表什么评论?在发布答案之前,我已经对问题添加了评论。我认为出现SEGFULT是因为文件未成功打开。fopen之后的fp为NULL。您只能怀疑fopen是问题所在。它不是100%确定=>解决方案用于注释,它不是答案。@i486如果不查看整个代码,我就不能100%确定。只有OP能说出他为什么会出错。谢谢你的意见,但我不能在发布后删除答案。
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);
}