运行不正常的代码:
#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地址是系统保护地址是不容许读写内容的!