提问者:小点点

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


刚接触C++时,我一直在忙着让我的头脑熟悉复杂的系统,比如指针和解决问题。 我制作了这个简单程序,它将串接char字符串。 但它总是抛出相同的错误:L'buffer太小&&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

然后程序崩溃。

请指出出了什么问题。 谢谢


共2个答案

匿名用户

根据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(不是一个好名字,btw)作为第二个参数传递给strcpy_s,以正确指示目标大小。