首页 > 解决方案 > g++ 和 vc++ 中 wcscpy 的不同行为

问题描述

int main()
{
  wchar_t ws1[] = L"happylearning";
  wchar_t ws2[] = L"Happy";

  wcscpy(ws2, ws1);
  wcout << ws1 << endl
        << ws2 << endl;
}

这会在 VC++ 和 g++ 中产生不同的输出。

如:在 VC++ 中:

happylearning
happylearning

在 g++ 中:

rning
happylearning

谁能告诉我为什么会有差异。

我已经包含了所有必要的头文件

标签: c++

解决方案


这里wcscopy():_

如果 dest 数组不够大,则行为未定义。

未定义意味着一个编译器(如 VC++)和另一个(如 g++)可以自由产生不同的行为/结果。

由于这种初始化. wchar_t ws1[]=L"happylearning";_ _ 而 in ,只有 6 个字符长(5 + 1 个空终止符)。因此,根据上述文档的摘录,目标数组( ) 太小而无法复制到它上面。因此违反了这一点,因此您遇到了未定义的行为。ws1charwchar_t ws2[]=L"Happy";ws2wcscpy()ws2ws1

值得一提的是,这根本不是两个给定编译器之间的一致差异,但未定义的行为意味着即使对于同一个编译器,结果也不能保证以任何形式重现或保持一致。


推荐阅读