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

C语言逐字符打印字符串遇SIGSEGV错误(exit code 139)求解决

修复C语言字符串遍历的段错误问题

问题原因

你的代码触发SIGSEGV段错误,核心是运算符优先级错误:
print函数中的*string[i],由于[]的优先级高于*,实际执行逻辑是*(string[i])。但string是指向单个char*变量(name)的指针,当循环i>=1时,string[i]会访问超出该指针内存范围的区域,直接触发内存访问错误。

此外还有两处细节问题:

  1. 循环中每次调用strlen(*string)会重复计算字符串长度,浪费性能;
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:40:22