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

C++按引用传递char*参数时获取到空字符串问题求助

问题根因分析

核心问题是出现了悬垂指针,属于C++典型的未定义行为,具体原因如下:

  • 函数fun中定义的tmp、temp都是栈上的局部std::string对象,函数执行完成返回后,这两个局部对象会被自动析构,其内部存储字符串的内存空间会被系统回收、标记为可用。
  • 你在函数内给引用参数x、y赋值的是这两个局部string内部字符数组的首地址,函数返回后该地址指向的内存已经失效,访问这块内存的结果完全不可预期,你遇到的空字符串只是未定义行为的一种表现,还可能出现乱码、程序崩溃等情况。

解决方案

根据你的使用场景可以选择以下适配方案:

方案1:static修饰局部string(仅适用单线程、非重入场景)

将局部string改为静态变量,其生命周期会延伸至程序全程,不会在函数返回时被析构:

void fun(char* &x, char* &y)
{
    static std::string tmp = "hello"; 
    static std::string temp = "world";
    // C++17及以上推荐用data()获取非const char*,低版本可保留&tmp[0]写法
    x = tmp.data();
    y = temp.data();
}

注意该方案下多次调用函数会复用同一块内存,不适合多线程、重入场景使用。

方案2:调用方提前分配内存,函数内拷贝内容

如果导出函数约定由调用方管理内存,可在调用侧提前分配足够长度的缓冲区,函数内仅做内容拷贝:

#include <cstring>
// 不需要传指针引用,直接对传入的缓冲区写数据
void fun(char* x, char* y)
{
    std::string tmp = "hello"; 
    std::string temp = "world";
    strcpy(x, tmp.c_str());
    strcpy(y, temp.c_str());
}
int main()
{
    // 分配的缓冲区长度要大于等于字符串长度+1(预留末尾\0位置)
    char x[16];
    char y[16];
    fun(x, y);
}

方案3:函数内申请堆内存,调用方用完释放

如果字符串长度不固定,可在函数内动态申请内存存储内容,使用完成后手动释放避免内存泄漏:

#include <cstring>
void fun(char* &x, char* &y)
{
    std::string tmp = "hello"; 
    std::string temp = "world";
    x = new char[tmp.size() + 1];
    strcpy(x, tmp.c_str());
    y = new char[temp.size() + 1];
    strcpy(y, temp.c_str());
}
int main()
{
    char* x;
    char* y;
    fun(x, y);
    // 业务逻辑执行完成后释放内存
    delete[] x;
    delete[] y;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:39:03