C语言逐字符打印字符串遇SIGSEGV错误(exit code 139)求解决
修复C语言字符串遍历的段错误问题
问题原因
你的代码触发SIGSEGV段错误,核心是运算符优先级错误:print函数中的*string[i],由于[]的优先级高于*,实际执行逻辑是*(string[i])。但string是指向单个char*变量(name)的指针,当循环i>=1时,string[i]会访问超出该指针内存范围的区域,直接触发内存访问错误。
此外还有两处细节问题:
- 循环中每次调用
strlen(*string)会重复计算字符串长度,浪费性能; strtok(name, "\n")未判断name是否为NULL,若输入无空格会直接崩溃。
修改后的完整代码
#include <stdio.h> #include <string.h> void print(char **string){ // 先解引用得到目标字符串指针,避免重复运算 char *target_str = *string; size_t str_len = strlen(target_str); printf("%lu\n", str_len); printf("%s\n", target_str); for (int i = 0; i < str_len; i++){ printf("%d%c\n", i, target_str[i]); } } int main() { char string[100]; fgets(string,100,stdin); char *useles = strtok(string, " "); char *name = strtok(NULL, " "); // 安全去除换行符:先判断name非空,再用strchr定位换行符 if (name != NULL) { char *newline_pos = strchr(name, '\n'); if (newline_pos != NULL) { *newline_pos = '\0'; } } print(&name); }
核心修改说明
- 修复指针访问错误:将
*string[i]改为target_str[i](或(*string)[i]),确保先解引用拿到字符串指针,再访问对应索引的字符; - 优化性能:提前计算字符串长度并存储,避免循环中重复调用
strlen; - 增加鲁棒性:判断
name是否为NULL后再处理换行符,避免输入不符合预期时崩溃。
内容的提问来源于stack exchange,提问作者Joao Figueiras
相关产品推荐
相关产品推荐

