为何我的字符串反转程序中free操作会引发Segmentation fault?
问题分析与修复方案
核心问题拆解
指针传递失效
你在revStr函数中传递的newStr是值拷贝,函数内部malloc得到的内存地址只会保存在局部变量里,根本传不回main函数的out指针。main里的out始终是未初始化的野指针,执行free(out)时自然触发段错误。内存分配时机错误
原代码在递归终止时才分配内存,但此时递归已经开始回溯执行newStr[*idx]=*str的赋值操作——这时候newStr还没指向合法内存,属于非法访问,行为完全未定义。缺少字符串终止符
反转后的字符串没有添加'\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
相关产品推荐
相关产品推荐

