为什么C代码给出segfault



我只想知道为什么这段代码会给我segfault。

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],那么它就可以正常工作。

您没有分配任何内存;你只是在声明一个char *char str[100]将工作,或者:

char *str = malloc(100);

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

如果您这样做,请确保在完成后调用它上的free()

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

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

然后fgets(str, 80, fp)说从文件中提取80个字符,并从指定的位置开始存储。由于(很可能)你的程序不拥有那个位置,你会得到一个segfault。

char str[100];在堆栈上保留100个字符的空间作为数组,您可以使用str作为指向该数组开头的指针。你的程序可以用这个内存做任何它想做的事情,所以当你做fgets时没有segfault。请注意,如果您的数组太短,那么您可能仍然有问题,尽管不一定是segfault。

最新更新