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

为何字符串数字自增C代码在第15行触发Segfault(段错误)?

段错误原因及修复方案

核心错误原因

你在第15行触发段错误的根本原因是试图修改只读的字符串字面量:

  • 在C语言中,"000"这类字符串字面量会被编译器分配到只读内存区域(如.rodata段),该区域的内容不允许被修改。
  • 代码里char *test = "000";让指针test指向了这个只读区域,当调用IncrementStringNum函数修改str[len-1]时,就会触发内存访问违规,直接导致段错误。

修复方法

把只读的字符串字面量替换为可修改的字符数组,修改main函数中的变量定义:

char test[] = "000";

这样test会在栈上分配一块可写内存,自动复制"000"的内容进去,后续的修改操作就合法了。

补充:代码的其他潜在问题

当前代码只处理了最后一位小于9的情况,完全没处理进位逻辑(比如"009"自增应该变为"010"),如果需要完整实现数字字符串自增功能,得补充进位处理逻辑,示例如下:

void IncrementStringNum(char *str){
    size_t len = 0;

    // 检查字符串有效性并计算长度
    for(size_t i = 0 ; str[i] ; i++ , len ++){
        if(str[i] < '0' || str[i] > '9'){
            return;
        }
    }

    // 从最后一位开始处理进位
    int carry = 1; // 初始进位为1,表示要加1
    for (int i = len - 1; i >= 0 && carry; i--) {
        int digit = str[i] - '0';
        digit += carry;
        if (digit == 10) {
            digit = 0;
            carry = 1;
        } else {
            carry = 0;
        }
        str[i] = digit + '0';
    }

    // 如果最后还有进位(比如"999"自增后需要变成"1000"),需额外处理内存扩展,这里可根据需求补充逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:40:33