复制到新的char数组时,C ++ strcpy_s引发错误

时间:2019-04-06 20:57:25

标签: c++ arrays pointers char

我的目标是生成一个具有正确数量斑点的新数组,并将一个旧的字符数组复制到其中。

使用strcpy_s时,将引发异常。我无法弄清楚为什么会引发异常,该异常指出Buffer太小。我不能使用向量或字符串。如何使用strcpy_s和char数组解决此问题?

    char str[4] = { 't', 'e', 's', 't' };
    int allocated = 4;
    char * reservedString = new char[allocated]();
    strcpy_s(reservedString, allocated, str);

编辑: 更改我的代码以将一个代码添加到数组中,会给我同样的“缓冲区太小”异常。

char str[4] = { 't', 'e', 's', 't' };
int allocated = 4;
char * reservedString = new char[allocated+1]();
strcpy_s(reservedString, allocated, str);

编辑2: 正如有人评论的那样,str需要设置为5,并包含一个空终止符。谢谢你,这解决了我的问题。

更新的代码:

    char str[5] = { 't', 'e', 's', 't', '\0'};
    int allocated = 5;
    char * reservedString = new char[allocated]();
    strcpy_s(reservedString, allocated, str);

4 个答案:

答案 0 :(得分:1)

char str[4] = { 't', 'e', 's', 't' };是内存中的4字节数组。它不是字符串,并且完全是随机的,在这4个字节之后将出现“尾随”零,并且在两者之间还有任意数量的其他数据。
但是,strcpy_s()希望复制一个以零结尾的字符串,它只是检查源字符串是否适合目标而已。不会,这就是为什么会出现错误。

  

[...]在运行时检测到以下错误,并调用当前安装的约束处理程序函数:
  * src或dest是空指针
  * destsz为零或大于RSIZE_MAX
  * destsz小于或等于strnlen_s(src,destsz);换句话说,会被截断
  *源字符串和目标字符串之间会发生重叠

您获得了第三个,则“垃圾”字节将被截断。

答案 1 :(得分:1)

您需要五个字符来存储以零结尾的字符串<system.web> <compilation targetFramework="4.7.2"></compilation> <httpRuntime targetFramework="4.7.2" /> </system.web> 。您的"test"数组只有四个字符,没有零终止符。如果您想要一个零终止符,请这样声明:

str

那你当然需要

char str[] = "test";

然后:

int allocated = 5;

答案 2 :(得分:1)

  1. char * reservedString = new char[allocated]; strcpy_s(reservedString, allocated, str); 不是字符串。字符串是由NUL终止的非NUL字符序列。

  2. 您应该将缓冲区的大小传递给strcpy_s(),而不是最大字符串大小(减小一倍)。

  3. 也就是说,如果您完全使用str You shouldn't.

    使用strcpy(),或者您已经拥有确切的大小,memcpy()std::copy_n()

  4. 作为附带说明,将内存归零只是为了转身并覆盖它是毫无意义的浪费。

答案 3 :(得分:0)

您没有分配适当的内存:

char str[4] = { 't', 'e', 's', 't' };

它分配5个字节,每个字符分配4个字节,再加上空终止符。---

要做:

char str[4] = { 't', 'e', 's', 't' };
char * reservedString = new char[5]();
strcpy_s(reservedString, allocated, str);

或者:

char str[4] = { 't', 'e', 's', 't' };
char * reservedString = new char[5]();
strcpy(reservedString, str);