【问题标题】:C++ strcpy_s throws error when copying to new char array复制到新的 char 数组时 C++ strcpy_s 抛出错误
【发布时间】:2019-04-06 20:57:24
【问题描述】:

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

使用 strcpy_s 时,会抛出异常。我不知道为什么抛出异常,说明缓冲区太小。我不能使用向量或字符串。如何使用 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);

【问题讨论】:

    标签: c++ arrays pointers char


    【解决方案1】:

    您需要五个字符来存储以零结尾的字符串"test"。您的 str 数组只有四个字符,没有零终止符。如果您想要一个零终止符,请像这样声明它:

    char str[] = "test";
    

    那你当然需要

    int allocated = 5;
    

    然后:

    char * reservedString = new char[allocated];
    strcpy_s(reservedString, allocated, str);
    

    【讨论】:

    • @tevemadar(骆驼鸟?):感谢您指出这一点。我已经相应地编辑了我的答案。
    • 是的,这是匈牙利语。 Tevemadár 是一个较老的卡通系列中的角色,en.m.wikipedia.org/wiki/Jamie_and_the_Magic_Torch(原名“Yoo-hoo Bird”)
    【解决方案2】:

    char str[4] = { 't', 'e', 's', 't' }; 是内存中的一个 4 字节数组。它不是一个字符串,它是完全随机的,在这 4 个字节之后会出现一个“尾随”零,以及介于两者之间的任意数量的其他数据。
    但是,strcpy_s() 期望复制一个以零结尾的字符串,它所做的附加功能之一就是检查源字符串是否适合目标。它不会,这就是你得到错误的原因。

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

    你得到第三个,“垃圾”字节会被截断。

    【讨论】:

      【解决方案3】:
      1. str 不是字符串。字符串是一系列非 NUL 字符,以 NUL 结尾。

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

      3. 也就是说,如果你应该使用strcpy_s()You shouldn't.

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

      4. 作为旁注,将内存归零只是为了转身并覆盖它是一种毫无意义的浪费。

      【讨论】:

        【解决方案4】:

        你没有分配正确的内存:

        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);
        

        【讨论】:

        • 它没有分配五个字节!这是问题的一部分:str 不是以空值结尾的。
        • 我尝试将一个添加到数组中,但它仍然给了我“缓冲区太小”的异常。我担心使用 strcpy,因为如果我的代码中有错误,它会将内存写得太远。
        • 谢谢@TonyK,这是我的问题!
        猜你喜欢
        • 2014-12-27
        • 1970-01-01
        • 2020-04-27
        • 2012-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多