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 解决此错误? 谢谢!
【问题讨论】:
当标准库函数不符合您的预期时,请查看您调用它们时使用的参数。打印值 ossizeof(str)
。
【参考方案1】:
sizeof(str)
返回char*
的大小(可能)是4
或8
(字节),具体取决于实现。在您的情况下,它似乎是 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 的调用失败...“收到的消息意外或格式错误”和“提供给函数的缓冲区太小”