为什么向fgets传入未初始化char指针作为首参数会触发段错误?
段错误触发原因
你声明的char *p是未初始化的野指针,没有指向任何合法可写的内存空间,直接传给fgets会触发非法内存写入,进而触发段错误。
- 仅声明
char *p不做初始化时,指针变量里存储的是随机的垃圾地址,这个地址大概率不属于当前进程可写的内存范围,甚至可能是系统禁止访问的保护地址。 fgets的第一个参数需要接收一块提前申请好的、长度不小于第二个参数的可写缓冲区首地址,用来存储读取到的输入内容。传入野指针相当于让fgets往随机地址写数据,操作系统的内存保护机制会直接终止进程并抛出段错误。
正确实现方案
你可以选择两种常见的方式分配缓冲区:
1. 栈上分配静态缓冲区
// 直接声明固定长度的字符数组,数组名就是合法的缓冲区首指针 char buf[10]; fgets(buf, 10, stdin);
2. 堆上动态分配缓冲区
#include <stdlib.h> // 手动申请10字节的可写内存 char *p = malloc(10); if (p != NULL) { fgets(p, 10, stdin); // 内存使用完毕后手动释放,避免内存泄漏 free(p); p = NULL; }
内容的提问来源于stack exchange,提问作者XMan
相关产品推荐
相关产品推荐

