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

为何该C程序出现段错误?改用char s[100]数组即可运行?

C语言段错误原因:字符指针与数组的本质差异

问题描述

以下C语言代码运行时出现段错误,但将第4行的char *s替换为char s[100]数组后程序可正常执行,请问原因是什么?

#include<stdio.h>
int main(){
    int l=0;
    char *s;
    printf("enter string : \n");
    fgets(s,100,stdin);
    puts(s);
    while(s[l]!='\0'){
        l++;
    }
    printf("length : %d",l-1);
    return 0;
}

核心原因

  • 用char *s;声明的是一个字符指针变量,它只是个用来存储内存地址的容器,但初始化时没有被赋予任何有效的内存地址——指针里的初始值是随机的,可能指向系统保护内存、其他程序的内存或者当前程序未授权的区域。
  • 当fgets尝试把用户输入的字符串写到s指向的内存时,这种非法内存写入操作会直接触发操作系统的内存保护机制,抛出段错误终止程序。
  • 换成char s[100];后,程序会在栈上直接分配一块100字节的连续合法内存空间,数组名s作为指向这块内存起始地址的常量指针,fgets可以安全地将输入内容写入这块内存,程序自然能正常运行。

内容的提问来源于stack exchange,提问作者Rejeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:36:29