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

C语言程序触发Segmentation fault(core dumped)报错的原因及解决求助

Segmentation Fault 问题分析:字符串字面量修改导致的错误

我写的C语言程序逻辑看似正确,但运行时触发「Segmentation fault(core dumped)」错误,预期输出11。改用char[]可正常运行,且代码在非main函数中执行时无异常,请问问题出在哪里?

相关代码

#include<stdio.h>
#include<cs50.h>
#include<ctype.h>
#include<string.h>

int main(void)
{
    string s="I am a good boy";
    int len=strlen(s);
    int word=0;
    for(int i=0;i<len;i++)
    {
        s[i]=toupper(s[i]);
        if(s[i]>=65 && s[i]<=90)
        {
            word++;
        }
    }
    printf("%i",word);
}

输出情况

预期输出:11
实际输出:segmentation fault(core dumped)

问题原因

  • 核心错误:代码中string s="I am a good boy";定义的是字符串字面量,这类数据会被编译器放在程序的只读数据段(.rodata)中,属于不可修改的内存区域。循环里的s[i]=toupper(s[i]);试图修改只读内存,直接触发内存访问违规,导致段错误。
  • 改用char[]可行的原因:如果写成char s[] = "I am a good boy";,编译器会把字符串字面量复制到栈上的字符数组中,栈内存是可写区域,修改操作合法,因此不会报错。
  • 非main函数执行无异常的本质:这是未定义行为的巧合——修改字符串字面量本身就是C标准明确的未定义行为,不管在哪个函数中执行,都不保证安全。你的环境在非main函数中没崩溃只是偶然,换编译器或平台大概率还是会触发错误。

修正后的代码示例

#include<stdio.h>
#include<cs50.h>
#include<ctype.h>
#include<string.h>

int main(void)
{
    // 使用可写的栈上字符数组
    char s[] = "I am a good boy";
    int len = strlen(s);
    int word = 0;
    for(int i=0; i<len; i++)
    {
        s[i] = toupper(s[i]);
        // 用字符常量替代魔法数字,代码可读性更强
        if(s[i] >= 'A' && s[i] <= 'Z')
        {
            word++;
        }
    }
    printf("%i", word);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:30:11