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

C语言circumcisedString函数返回后出现空地址问题求助

问题分析:返回局部数组指针导致的地址失效问题

你遇到的核心问题是返回了局部栈变量的指针,具体原因如下:

在circumcisedString函数中,circS是声明在函数内部的局部字符数组,它的内存分配在栈帧上。当函数执行完毕返回时,当前函数的栈帧会被销毁,这块内存会被系统回收或被后续函数调用覆盖。

虽然函数内部打印circS的地址和内容正常,但返回后,remstr接收的是一个指向已释放内存的野指针。你看到的remstr地址为0,是因为栈帧销毁后,原指针指向的内存已经无效,被系统标记或覆盖,表现为空地址。

修复方案

有两种常见的解决思路:

  1. 动态分配内存:在函数内用malloc分配堆内存,返回堆指针(注意调用者需要手动free避免内存泄漏)
char* circumcisedString(char* og, char rem, int* checked)
{
    // 先计算需要的内存大小,避免浪费
    int len = 0;
    char* og2 = og;
    while(*og2) {
        if(*og2 != rem) len++;
        og2++;
    }
    char* circS = (char*)malloc(len + 1); // +1 存结束符
    if(!circS) return NULL; // 处理内存分配失败
    
    char* t= circS;
    og2 = og;
    while(*og2)
    {
        if(*og2 != rem)
        {
            *t = *og2;
            t++;
        }
        else
        {
            checked[og2 - og] = 1;
        }
        og2++;
    }
    *t = '\0';
    printf("%p ", circS); // 用%p打印指针更规范
    return circS;
}

调用后记得释放内存:

char* remstr = circumcisedString(rem, rem[i], checked);
// 使用remstr完成逻辑后
free(remstr);
  1. 由调用者提供缓冲区:让调用方传入预先分配好的数组,函数直接写入该缓冲区,避免内存管理问题
void circumcisedString(char* og, char rem, int* checked, char* outBuf, int bufSize)
{
    char* t= outBuf;
    char* og2 = og;
    while(*og2 && (t - outBuf) < bufSize - 1) // 避免缓冲区溢出
    {
        if(*og2 != rem)
        {
            *t = *og2;
            t++;
        }
        else
        {
            checked[og2 - og] = 1;
        }
        og2++;
    }
    *t = '\0';
}

调用方式:

char remstr[100];
circumcisedString(rem, rem[i], checked, remstr, sizeof(remstr));

另外注意:打印指针应该用%p格式符,而非%d,%d用于打印整数,%p才是标准的指针打印方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:23:38