我只想知道为什么这段代码会给我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。