C 分段故障

C 分段故障,c,segmentation-fault,C,Segmentation Fault,这是我的密码 #include<stdio.h> int main(int argc,char** argv) { FILE* fp; fp=fopen(argv[1],"r"); struct element{ int value; char activity; }; typedef struct element element; element a; printf("%d",feof(f

这是我的密码

#include<stdio.h>

int main(int argc,char** argv)
{
    FILE* fp;
    fp=fopen(argv[1],"r");

    struct element{
        int value;
        char activity;
    };

    typedef struct element element;
    element a;
    printf("%d",feof(fp));
}

为什么?

检查
fopen
的返回值(好吧,检查任何调用的返回值),它可能无法打开文件。

检查
fopen
的返回值(好吧,检查任何调用的返回值),它可能无法打开文件。

因为您没有在命令行参数中指定文件,或者由于某种原因无法打开您在其中指定的文件。在这种情况下,
fopen
返回
NULL
,当您将该
NULL
传递给
feof
时,程序崩溃。您必须检查返回值和错误代码,尤其是当函数可能返回
NULL

正确的代码可能如下所示:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
    FILE *fp;

    if (argc < 2)
    {
        fprintf (stderr, "Please specify the file name.\n");
        return EXIT_FAILURE;
    }

    fp = fopen(argv[1], "r");

    if (fp == NULL)
    {
        perror ("Cannot open input file");
        return EXIT_FAILURE;
    }

    printf ("%d\n", feof (fp));
    return EXIT_SUCCESS;
}
#包括
#包括
int main(int argc,char*argv[])
{
文件*fp;
如果(argc<2)
{
fprintf(stderr,“请指定文件名。\n”);
返回退出失败;
}
fp=fopen(argv[1],“r”);
如果(fp==NULL)
{
perror(“无法打开输入文件”);
返回退出失败;
}
printf(“%d\n”,feof(fp));
返回退出成功;
}

因为您没有在命令行参数中指定文件,或者因为某些原因无法打开您在其中指定的文件。在这种情况下,
fopen
返回
NULL
,当您将该
NULL
传递给
feof
时,程序崩溃。您必须检查返回值和错误代码,尤其是当函数可能返回
NULL

正确的代码可能如下所示:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
    FILE *fp;

    if (argc < 2)
    {
        fprintf (stderr, "Please specify the file name.\n");
        return EXIT_FAILURE;
    }

    fp = fopen(argv[1], "r");

    if (fp == NULL)
    {
        perror ("Cannot open input file");
        return EXIT_FAILURE;
    }

    printf ("%d\n", feof (fp));
    return EXIT_SUCCESS;
}
#包括
#包括
int main(int argc,char*argv[])
{
文件*fp;
如果(argc<2)
{
fprintf(stderr,“请指定文件名。\n”);
返回退出失败;
}
fp=fopen(argv[1],“r”);
如果(fp==NULL)
{
perror(“无法打开输入文件”);
返回退出失败;
}
printf(“%d\n”,feof(fp));
返回退出成功;
}

fopen()失败,因此返回0?fopen()失败,因此返回0?是的,我的makefile中追加了.txt。现在我有另一个问题。在命令
make
时,它给出错误。0make:**[a.out]错误1为什么?是的,我的Make文件中追加了.txt。现在我有另一个问题。在命令
make
时,它给出错误。0制作:**[a.out]错误1为什么?请检查答案。谢谢你的回答。请检查一下答案。谢谢你的回答。