strcpy_s 缓冲区 L 缓冲区太小 && 0

Posted

技术标签:

【中文标题】strcpy_s 缓冲区 L 缓冲区太小 && 0【英文标题】:strcpy_s buffer L buffer is too small && 0 【发布时间】:2017-10-28 20:47:25 【问题描述】:

我有问题。

我尝试执行以下步骤:

    char * str;
    char * s="Hello";
    int len = std::strlen(s);
        str=new char[len +10];
    strcpy_s(str,sizeof(str) ,s);

但是程序显示错误,我在标题中写了。

如果我将 sizeof(str) 替换为数字,例如 256,则会出现一个弹出窗口,并显示消息 project.exe 已触发断点。

如何使用 strcpy_s 解决此错误? 谢谢!

【问题讨论】:

当标准库函数不符合您的预期时,请查看您调用它们时使用的参数。打印值 os sizeof(str) 【参考方案1】:

sizeof(str) 返回char* 的大小(可能)是48(字节),具体取决于实现。在您的情况下,它似乎是 4 不足以容纳构成 "Hello" 文字加上空终止字符的字符。由于空间不足,strcpy_s 函数调用undefined behavior。对于空字符,您至少需要 6 字节数 + 1 字节数。此外,您可能指的是 str = new char[len + 1]; 而不是 str=new char[len + 10]; 以适应 \0 字符。因此你的代码应该是:

#include <iostream>

int main()
    char* str;
    char* s = "Hello";
    int len = std::strlen(s);
    str = new char[len + 1];
    strcpy_s(str, len + 1, s);

也就是说,比起 C 风格的字符数组,更喜欢 std::string。

【讨论】:

【参考方案2】:

sizeof(str) 给出了char* 的大小,不是分配数组的长度。要解决此问题,您必须给出分配的长度。在这种情况下,这将是

strcpy_s(str, len + 10, s);

【讨论】:

你能解释一下,为什么我必须写 len + 10 吗?我以为我只需要制作 len + 1,因为结尾是 '\0'? 因为第二个参数应该是目标缓冲区的大小。有关详细信息,请参阅en.cppreference.com/w/c/string/byte/strcpy。 在源代码中的示例中,我看到以下代码部分:char dst[strlen(src) + 1]; // +1 以适应空终止符,那么为什么我必须使 len +10 而不是 len +1?我有办法让 len +10 吗?非常感谢您的指导! 我从你的问题中取出了 10 个,你在其中分配了new char[len + 10];。你是对的,len + 1 就足够了。

以上是关于strcpy_s 缓冲区 L 缓冲区太小 && 0的主要内容,如果未能解决你的问题,请参考以下文章

调试断言失败(缓冲区太小)构造函数初始化

.NET 和 MySQL 错误 - 对 SSPI 的调用失败...“收到的消息意外或格式错误”和“提供给函数的缓冲区太小”

oracle expdp导出报错“字符串缓冲区太小”

执行动态SQL报“字符串缓冲区太小”错误,请问各位高手怎么解决啊

strncpy_s - 缓冲区太小断言

Oracle 数据访问 ORA-06512: 字符串缓冲区太小