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

基于指针实现内存中字符串反转的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;
}

关键修正点说明

  1. 函数重构:给ters_cevir加上返回类型void,并直接接收char*类型的字符串参数,去掉了容易出问题的全局变量
  2. 内存分配修复:分配了100字节的空间,足够存储大部分短字符串,同时增加了malloc失败的判断
  3. 反转逻辑修正:
    • 先把end指针移动到最后一个有效字符(不是结束符)
    • 通过交换start和end指向的字符,逐步向中间靠拢,直到两个指针相遇,完成反转
  4. 语法与变量修复:修正了指针取值的语法错误,删除了未定义的sayac变量,直接用printf("%s", isim)输出反转后的字符串(更简洁)
  5. 内存管理:增加了free(isim),避免内存泄漏

内容的提问来源于stack exchange,提问作者Ömer Bulut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:29:26