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
相关产品推荐
相关产品推荐

