尝试从文件读取时代码崩溃

问题描述

以下代码在我尝试从中读取时崩溃。 我在这行中发现了细分错误

fgets(s,sizeof(str[i]),fp);

#include <stdio.h>

int main()
{
    char *str[] = {"John ","Linus ","Michael ","Bill"};
    char *s;

    int i;

    FILE* fp;

    if((fp = fopen("E:\\Files\\string.txt","w")) == NULL)
    {
        printf("Error creating file");
        return 0;
    }

    else
    {
        for(i = 0; i < 4; ++i)
        {
            fputs(str[i],fp);
            fflush(fp);
        }

        fclose(fp);
    }

    if((fp = fopen("E:\\Files\\string.txt","r")) == NULL)
        printf("Error opening file");
    else
    {
        for(i = 0; i < 4; ++i)
        {
            fgets(s,fp);
            printf("%s ",s);
        }

        fclose(fp);
    }

    return 0;
}

解决方法

关于:

fgets(s,sizeof(str[i]),fp);

变量s只是一个未初始化的指针,它包含堆栈中每个垃圾堆所在位置的内容。使用该指针而不进行初始化会导致未定义行为,并且可能(如您所见会导致段错误事件。

建议将s的定义更改为:

char s[sizeof(str)];

表达式sizeof(str[i]) is referencing a single byte,perhaps you meant: sizeof(str);`