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

我是C ++的新手,当时我正忙于尝试使自己的头脑转向复杂的系统,例如指针和解决问题。我制作了这个简单的程序,它将串联char字符串。但是它总是抛出相同的错误: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

然后程序崩溃。

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

iCMS 回答:使用strcat获取缓冲区溢出错误

根据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字节,但不能复制0字节,因为据认为目标数组(如参数所示)太小。将buffer(不是很好的名字,btw)作为第二个参数传递到strcpy_s,以正确指示目标大小。

本文链接:https://www.f2er.com/2001879.html

大家都在问