Code Bye

关于 fgets 的一个疑问,小白求

运行不正常的代码:
#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];是在栈上分配的空间,可以写入

10

C 语言保证 0 (NULL)不是有效的数据地址,即值为 NULL的指针不会指向任何数据内容,因此你不可以向它写入任何内容。

10

第一个方法里的str是NULL   NULL是0,那么0地址是系统保护地址是不容许读写内容的!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于 fgets 的一个疑问,小白求