wcscpy在g ++和vc ++中的不同行为

时间:2018-08-23 14:29:21

标签: c++

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

谁能让我知道为什么会有差异。

我已包含所有必需的头文件

1 个答案:

答案 0 :(得分:4)

有关wcscopy(),请参见here

  

如果dest数组不够大,则行为为 undefined

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

wchar_t ws1[]=L"happylearning";中,ws1长14个字符(13 + 1个空终止符),这是由于这种初始化{{1}的 C样式数组的方式}。在char中,wchar_t ws2[]=L"Happy";仅6个字符长(5 +1个空终止符)。因此,根据上述ws2文档的摘录,目标数组wcscpy())太小,无法复制到ws2上。因此违反了此​​规则,因此违反了您遇到的未定义行为

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