为什么C代码会给出段错误?

时间:2012-01-26 06:03:06

标签: c segmentation-fault

我只是想知道为什么这段代码给了我段错误。

if(argc < 2){
    printf("\n Please mention the file name");
    exit(1);
}
FILE* fp;
if((fp = fopen(argv[1],"r")) == NULL){
    printf("\n can't open file");
    exit(1);
}
char* str;
fgets(str,80,fp);
printf("\n this is the output %s",str);

如果我将str声明为char str [100],那么它可以正常工作。

3 个答案:

答案 0 :(得分:3)

你没有分配任何内存;你只是声明char *char str[100]可以使用,或者:

char *str = malloc(100);

这将为你的字符串分配内存。否则,您只是从fgets()读取到不属于您的内存中,并导致分段错误。

如果您这样做,请务必在完成后致电free()

答案 1 :(得分:2)

char* str是一个未初始化的指针。 fgets写入此指针指向的内存,可以是任何位置。使用str[100]声明实际存储空间可以提供100字节的有效内存。

答案 2 :(得分:0)

char* str;声明指向char的指针,但不为字符本身保留任何空间。此外,由于你没有初始化它,它指向内存中的一些随机位置。

然后fgets(str, 80, fp)表示从文件中取出80个字符并从指定位置开始存储它们。由于(很可能)您的程序不拥有该位置,因此会出现段错误。

char str[100];保留堆栈上100个字符的空格作为数组,您可以使用str作为指向此数组开头的指针。您的程序可以使用此内存执行任何操作,因此在执行fgets时不会出现段错误。请注意,如果您的阵列太短,那么您可能仍会遇到问题,但不一定是段错误。