感谢您提供的代码和问题。根据您的代码,我看到了两个问题。
1. 乱码问题:
在代码中,您将重新分配的内存地址赋值给了指针q,然后将q转换为CString类型并输出为Debug信息。但是,您可能在创建CString对象时没有正确处理字符编码。CString默认使用系统默认的字符编码,这可能会导致乱码问题。
解决方法是使用CStringT类模板及其相关的字符集类型参数来明确指定字符编码。例如,如果您的字符集是Unicode,可以使用CStringW类来处理:
CStringW str(q);
::OutputDebugStringW(str);
或者,如果您的字符集是多字节字符集(如UTF-8),可以使用CStringA类来处理:
CStringA str(q);
::OutputDebugStringA(str);
选择适当的CString类取决于您的应用程序和字符集的设置。
2. q没有扩容问题:
您在代码中使用realloc函数来改变p所指向内存的大小,并将返回的新内存地址赋值给q。然而,在使用realloc函数时,它可能会返回一个新的内存地址,也可能会在原地扩展原始内存块。因此,即使q和p不相等,q实际上可能指向了p之前指向的内存块,并且已经成功地改变了内存大小。
但是,问题在于您在代码的最后一行尝试将终止符'\0'写入p指向的内存地址,而不是q。为了修复这个问题,您应该将 *(p + 14 * sizeof(TCHAR)) 修改为 *(q + 14 * sizeof(TCHAR)),以正确设置终止符。
修正后的代码如下所示:realloc, TCHAR* p, * q;
p = (TCHAR*)malloc(10 * sizeof(TCHAR));
for (int i = 0; i < 9 * sizeof(TCHAR); i += sizeof(TCHAR)) {
*(p + i) = _T('a');
}
*(p + 9) = _T('\0');
q = (TCHAR*)realloc(p, 15 * sizeof(TCHAR));
if (q != NULL) {
for (int i = 9 * sizeof(TCHAR); i < 13 * sizeof(TCHAR); i += sizeof(TCHAR)) {
*(q + i) = _T('b');
}
}
*(q + 14 * sizeof(TCHAR)) = _T('\0');
CString str(q);
::OutputDebugString(str);
请尝试使用修改后的代码,并检查乱码和扩容问题是否得到解决。如果问题仍然存在,请提供更多详细信息,以便我可以更好地帮助您解决问题。另外,请确保您的工程已正确设置字符编码和相关选项。
如果问题已经解决,请设置最佳答案 |