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

