我只是想知道为什么这段代码给了我段错误。
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],那么它可以正常工作。
答案 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
时不会出现段错误。请注意,如果您的阵列太短,那么您可能仍会遇到问题,但不一定是段错误。