基于指针实现内存中字符串反转的C代码问题排查与修正
排查并修正字符串反转函数的问题
咱们一步一步拆解你代码里的问题,然后逐个修复,让字符串反转功能正常工作:
原代码的核心问题清单
- 语法错误:
som1=som*;这行完全写反了,取指针指向的内容应该是*som,正确写法是som1 = *som; - 内存分配不足:
malloc(sizeof(char))只分配了1字节的空间,根本存不下用户输入的字符串(哪怕是一个字母加结束符都要2字节),必须分配足够的空间 - 指针类型不匹配+赋值错误:
i被定义为int*,但你要操作的是char*类型的字符串指针;而且i=&isim;是把指针的地址赋值给i,这完全没必要,我们直接传递字符串指针即可 - 反转逻辑错误:原代码里
*term=som;是把指针本身赋值给字符变量,这完全不符合逻辑,正确的反转应该是交换字符串首尾的字符,直到两个指针相遇 - 未定义变量:
sayac没有声明就直接使用,属于编译错误 - 函数设计不合理:用全局变量
i传递参数,既不优雅也容易出问题,应该给反转函数直接传递字符串指针参数 - 反转后未正确保留结束符:原逻辑会覆盖字符串的结束符
'\0',导致输出异常
修正后的完整代码
#include <stdio.h> #include <stdlib.h> // 字符串反转函数:直接接收字符串指针,仅用指针操作 void ters_cevir(char *str) { if (str == NULL) return; // 空指针判断,避免崩溃 char *start = str; char *end = str; char temp; // 移动end指针到字符串最后一个有效字符(不是'\0') while (*end != '\0') { end++; } end--; // 回退到最后一个字符 // 交换首尾字符,直到start超过end while (start < end) { temp = *start; *start = *end; *end = temp; start++; end--; } } int main() { // 分配足够的内存(这里设为100字节,可根据需求调整) char *isim = malloc(100 * sizeof(char)); if (isim == NULL) { // 检查malloc是否成功 printf("内存分配失败!\n"); return 1; } printf("请输入要反转的字符串:"); scanf("%s", isim); // 读取输入字符串(注意:不能包含空格,若要支持空格需用fgets) ters_cevir(isim); // 调用反转函数,直接操作内存中的字符串 printf("反转后的字符串:%s\n", isim); free(isim); // 释放malloc分配的内存,避免内存泄漏 return 0; }
关键修正点说明
- 函数重构:给
ters_cevir加上返回类型void,并直接接收char*类型的字符串参数,去掉了容易出问题的全局变量 - 内存分配修复:分配了100字节的空间,足够存储大部分短字符串,同时增加了
malloc失败的判断 - 反转逻辑修正:
- 先把
end指针移动到最后一个有效字符(不是结束符) - 通过交换
start和end指向的字符,逐步向中间靠拢,直到两个指针相遇,完成反转
- 先把
- 语法与变量修复:修正了指针取值的语法错误,删除了未定义的
sayac变量,直接用printf("%s", isim)输出反转后的字符串(更简洁) - 内存管理:增加了
free(isim),避免内存泄漏
内容的提问来源于stack exchange,提问作者Ömer Bulut
相关产品推荐
相关产品推荐

