c ++调用c函数mbstowcs()更改参数

时间:2012-08-10 22:19:56

标签: c visual-studio-2008 visual-c++

我有一个效果不佳的mbstowcs():

mbstowcs(pParams->strDstFile, parParams->DstFile, sizeof(parParams->DstFile));

debug的参数值是:

pParams->strDstFile = 0x0018e70c
parParams->DstFile = 121 long null terminated string.
sizeof(parParams->DstFile) = 1024

参数类型是:

TCHAR strDstFile[2048]; 
char DstFile[1024];

进入mbstowcs(wchar_t * pwcs,const char * s,size_t n)后的一步:

wchar_t  *pwcs = 0x0018ef0c

与发送的值不同。这导致上述呼叫失灵。

P.S。在另一个函数调用中,几乎与此函数相同,只有不同的第一个参数(pwcs)的区别,没有问题。

应用程序的连续运行会产生相同的结果,并具有完全相同的地址值。

在查看另一篇文章的同时,它似乎是一个悬空指针/缓冲区溢出,但我无法用内存断点跟踪它。

我在想堆栈腐败?

谢谢大家。

1 个答案:

答案 0 :(得分:0)

对于如何扩展TCHAR和各种TCHAR宏似乎有几种不同的影响,请参阅_UNICODE vs UNICODE和此帖posting on _UNICODE vs UNICODE

在使用mbstowcs()时,max size参数应以字符为单位指定目标缓冲区的大小,而不是源缓冲区的大小。这有助于防止缓冲区溢出。请参阅mbstowcs description另请注意,如果字符数为最大值,mbstowcs()将不会终止,这种行为与大多数字符操作函数类似。

由于mbstowcs()用于宽字符串,因此您应该使用宽字符串而不是TCHAR。

看起来您的问题是由于堆栈覆盖造成的。您使用相同的测试数据或不同的数据并获得不同的结果吗?

Microsoft为Visual Studio引入的各种TCHAR和_T()扩展实际上是为了允许在非UNICODE版本的Windows(如Windows 95/98)和UNICODE版本的Windows(如Windows XP)之间轻松移植应用程序。多字节字符串功能还旨在为Windows 95/98等泰语或简体中文等语言提供支持,因为它们对UNICODE没有太多核心Windows API支持,UNICODE是32位Windows版本(如Windows XP或Windows)的一部分CE。

在Windows XP及更高版本的UNICODE世界中,使用TCHAR扩展似乎没什么价值,因为它们只会增加源和编译器设置的复杂性。

不确定为什么使用多字节字符串而不是UNICODE。我有一个针对Windows 98和Windows XP的旧应用程序,它确实在用户界面进行了一些转换,但是所有内容都在内部存储为宽字符,UNICODE字符串。我在应用程序中引入了对多字节字符串的原始支持,但在当时似乎是一个好主意,但它引入了我真正希望我没有做过的复杂性。可能是你在做类似的事情。