C++-strcpy_s()总是失败,即使只将一个字节复制到大缓冲区

C++ - strcpy_s() always fails even if copying just one byte to big buffer

本文关键字:一个 字节 缓冲区 复制 失败 C++-strcpy      更新时间:2023-10-16

我觉得我一直使用strcpy来复制字符串而没有遇到任何麻烦,但我已经很久没有这样做了,现在无论我做什么都无法让它工作。

我确信我错过了一些愚蠢的东西,但我已经为此感到沮丧了一段时间,所以我来这里是想看看是否有其他人可以帮忙。

const char* src = "Lalalala";
int strLen = strlen(src);
char* dest = new char[strLen + 1];
ZeroMemory(dest, strLen + 1);
strcpy_s(dest, strLen, src);

这段代码引发了一个异常,指出lBuffer太小。即使我尝试只复制"一个字节"的数据,并分配128个字节的缓冲区,它也会抛出同样的异常。

此外,我已经检查了strlen是否返回了预期值,分配和"ZeroMemory"函数调用是否正常,只有在运行strcpy_s()函数时,程序才会崩溃。我不知道这里发生了什么,请帮帮我!

感谢

strcpy_s的第二个参数是numberOfElements。这是缓冲区大小,而不是字符串长度。

来自MSDN:

numberOfElements
     Size of the destination string buffer in char units for narrow and multi-byte functions, and wchar_t units for wide functions.

当您在上面的示例中调用strcpy_s时,您将传递8作为缓冲区的长度,但strcpy_s希望复制9个字符。字符串的8个字符+1个空终止符。它看到缓冲区不够大,就扔了出去。

尝试传递strLen + 1,它是缓冲区的实际大小。应该在那里工作。