C6057

更新:2007 年 11 月

警告 C6057:<function> 调用中的字符数/字节数不匹配,造成缓冲区溢出

此警告意味着向需要字符数的函数传递了字节数。对于宽字符 (Unicode),这两者的值是不同的。此缺陷可能会导致可利用的缓冲区溢出或系统崩溃。

产生此缺陷的一个常见原因是对字符数组使用了 sizeof。sizeof 运算符始终计算字节数;对于 ANSI 字符而言,字节数与字符数是相同的,但是对于 Unicode 字符而言,字节数是字符数的两倍。

通常,可以放心地通过将数组的大小除以每个元素的大小来计算数组中的元素数。

示例

如果使用 Unicode 字符集来编译下面的代码,将生成此警告:

#include<tchar.h>
#include<windows.h>

void f( HINSTANCE hInst, UINT uID )
{
  TCHAR buff[128];
  if ( LoadString ( hInst, uID, buff, sizeof buff ) ) // warning C6057
  {
    // code...
  }
}

若要更正此警告,请将数组的大小除以元素的大小,如下面的代码所示:

#include<tchar.h>
#include<windows.h>

void f(HINSTANCE hInst,UINT uID)
{
  TCHAR buff[128];
  if( LoadString ( hInst, uID, buff, (sizeof buff)/(sizeof buff[0]) ) )
  {
    // code...
  }
}

有关如何在 Visual C++ 中使用 Unicode 字符集的信息,请参见 “常规”属性页(项目)

请参见

其他资源

LoadString