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
相关产品推荐
相关产品推荐

