You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:36:01