为何字符串数字自增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
相关产品推荐
相关产品推荐

