运行不正常的代码:
#include <stdio.h> int main(int argc, char **argv) { char *str; str = NULL; char *ptr; ptr = NULL; //char str[24]; ptr = fgets(str, 1024, stdin); printf("%s\n", ptr); return 0; }
可以运行正常的代码:
#include <stdio.h> int main(int argc, char **argv) { //char *str; //str = NULL; char *ptr; ptr = NULL; char str[24]; ptr = fgets(str, 1024, stdin); printf("%s\n", ptr); return 0; }
本人的疑问是: fgets 的第一个参数不是接收一个 char 类型的指针吗? 那么第一种方式为啥会错了呢?
解决方案
40
你第一种方式:
char *str;
str = NULL;
意味着str指向了地址为0的区域(该区域禁止写操作)
然后你fgets(str, 1024, stdin);试图向地址为0的区域写入读到的数据,肯定报错了
而第二种方式char str[24];是在栈上分配的空间,可以写入
char *str;
str = NULL;
意味着str指向了地址为0的区域(该区域禁止写操作)
然后你fgets(str, 1024, stdin);试图向地址为0的区域写入读到的数据,肯定报错了
而第二种方式char str[24];是在栈上分配的空间,可以写入
10
C 语言保证 0 (NULL)不是有效的数据地址,即值为 NULL的指针不会指向任何数据内容,因此你不可以向它写入任何内容。
10
第一个方法里的str是NULL NULL是0,那么0地址是系统保护地址是不容许读写内容的!