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

C++中TCHAR*参数传递问题:如何修改调用方数组值?

解决C++中函数修改调用方变量值的问题

你的代码里MaskSensitiveData函数接收的szData是指针的值拷贝——函数内部拿到的是原指针的副本,直接给szData = L"Test"只是修改了这个副本的指向,完全不会影响调用方的szTest数组。要修改调用方的变量,得根据变量类型选择正确的传参方式。

方案1:修改指针指向的内存(适合栈数组/已分配好的缓冲区)

因为你传入的是栈上的TCHAR szTest[100],数组名退化成指针后,指向的是栈上的缓冲区。你需要用字符串复制函数修改这块内存的内容,而不是修改指针本身:

void MaskSensitiveData(TCHAR* szData, size_t bufferSize, bool bEncryptAll)
{
    // 使用安全的字符串复制函数,避免缓冲区溢出
    _tcscpy_s(szData, bufferSize, L"Test");
}

void CMFCTestDlg::OnBnClickedButton1()
{
    TCHAR szTest[100] = L"This is a Password:myPass";
    // 传入数组大小,_countof可以获取栈数组的元素个数
    MaskSensitiveData(szTest, _countof(szTest), false);
    AfxMessageBox(szTest);
}

这里用_tcscpy_s是因为TCHAR需要适配ANSI和Unicode环境,_countof能自动获取栈数组的长度,避免硬编码数值导致的溢出问题。

方案2:传递指针的指针/引用(适合需要修改指针指向的场景)

如果你的需求是让调用方的指针指向新的内存(比如动态分配的缓冲区),就需要传递指针的指针或者指针引用:

方式A:指针的指针

void MaskSensitiveData(TCHAR** szData, bool bEncryptAll)
{
    // 动态分配内存,注意调用方需要释放
    *szData = new TCHAR[5];
    _tcscpy_s(*szData, 5, L"Test");
}

void CMFCTestDlg::OnBnClickedButton1()
{
    TCHAR* szTest = new TCHAR[100];
    _tcscpy_s(szTest, 100, L"This is a Password:myPass");
    // 传入指针的地址
    MaskSensitiveData(&szTest, false);
    AfxMessageBox(szTest);
    // 释放动态分配的内存
    delete[] szTest;
}

方式B:指针的引用

void MaskSensitiveData(TCHAR*& szData, bool bEncryptAll)
{
    // 释放原内存(如果需要),再分配新内存
    delete[] szData;
    szData = new TCHAR[5];
    _tcscpy_s(szData, 5, L"Test");
}

void CMFCTestDlg::OnBnClickedButton1()
{
    TCHAR* szTest = new TCHAR[100];
    _tcscpy_s(szTest, 100, L"This is a Password:myPass");
    // 直接传入指针引用
    MaskSensitiveData(szTest, false);
    AfxMessageBox(szTest);
    delete[] szTest;
}

总结

针对你当前的场景(修改栈上数组的内容),方案1是最优选择,不需要动态分配内存,代码更简洁安全。如果涉及动态内存的重新分配,再考虑方案2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:20:44