使用 strcat 获取缓冲区溢出错误

getting buffer overflow error using strcat

本文关键字:溢出 错误 缓冲区 获取 strcat 使用      更新时间:2023-10-16

C++新手,我四处闲逛,试图了解指针和解决问题等复杂系统。我制作了这个简单的程序,它将连接字符字符串。但它总是抛出相同的错误:L'buffer is too small &&0.

这是我的代码 -

const char* str = "larry";
const char* yo{"is one of the stooges" };
size_t buffer{ std::strlen(str) + std::strlen(yo) + 1 };
std::cout << buffer;
char* buff = new char[buffer];
strcpy_s(buff, strlen(str), str);
strcat(buff, yo);
std::cout << *buff << std::endl;
delete[] buff; 

这是我根据要求的程序输出:

27             // the size of buffer

然后程序崩溃。

请指出问题所在。 谢谢

根据 C 标准(K.3.7.1.3 strcpy_s函数(

2 s1 和 s2 都不应为空指针。 s1max 不应 大于 RSIZE_MAX. S1max 不应等于零。S1max 应为 大于 strnlen_s(S2, S1max(。不得进行复制 在重叠的对象之间。

那就是你必须写

strcpy_s(buff, strlen(str) + 1, str);

否则,将不会复制str指向的字符串的终止零。在这种情况下,下一个调用

strcat(buff, yo);

调用未定义的行为。

strcpy_s的第二个参数是目标数组的大小,包括0 字节。但是,您传入源字符串的大小,不包括0 字节。strcpy_s尝试复制 0 字节,但它不能,因为目标数组应该(如参数所示(太小。将buffer(不是一个好名称,顺便说一句(作为第二个参数传递给strcpy_s以正确指示目标大小。