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

为何我的字符串反转程序中free操作会引发Segmentation fault?

问题分析与修复方案

核心问题拆解

  1. 指针传递失效
    你在revStr函数中传递的newStr是值拷贝,函数内部malloc得到的内存地址只会保存在局部变量里,根本传不回main函数的out指针。main里的out始终是未初始化的野指针,执行free(out)时自然触发段错误。

  2. 内存分配时机错误
    原代码在递归终止时才分配内存,但此时递归已经开始回溯执行newStr[*idx]=*str的赋值操作——这时候newStr还没指向合法内存,属于非法访问,行为完全未定义。

  3. 缺少字符串终止符
    反转后的字符串没有添加'\0',虽然printf侥幸输出了内容,但这是依赖内存中的随机值,属于未定义行为,必须手动添加终止符。

修复后的代码示例

#include <stdio.h>
#include <stdlib.h>

// 计算字符串长度(不含终止符)
int getStrLen(char *str) {
    int len = 0;
    while (*str != '\0') {
        len++;
        str++;
    }
    return len;
}

// 递归反转字符串
void revStr(char *str, char *newStr, int *idx) {
    if (*str != '\0') {
        revStr(str + 1, newStr, idx);
        newStr[*idx] = *str;
        (*idx)++;
    }
}

int main(void) {
    char *in = "This is a test string.";
    int strLen = getStrLen(in);
    
    // 分配内存:长度+1用于存储'\0',同时检查分配是否成功
    char *out = (char*)malloc(sizeof(char) * (strLen + 1));
    if (out == NULL) {
        perror("malloc failed");
        return 1;
    }

    int idx = 0;
    revStr(in, out, &idx);
    out[strLen] = '\0'; // 手动添加字符串终止符

    printf("Out:%s\n", out);
    free(out); // 此时out是合法的malloc地址,free不会崩溃

    return 0;
}

关键修改说明

  • 提前计算字符串长度,在main中完成内存分配,确保递归赋值时内存是合法可访问的。
  • 修改revStr的逻辑,去掉原函数中混乱的内存分配和索引操作,专注于递归反转的核心逻辑。
  • 添加malloc失败的检查,避免内存分配失败导致后续错误。
  • 手动添加'\0',保证字符串符合C语言的规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:06:32