Array为更多元素分配空间而不是请求

时间:2015-03-18 04:47:11

标签: c++

当我执行以下代码时, c_copy 初始化的元素多于 sz 指定的元素,导致此行为的原因是什么?我想也许它发生了,因为数组需要一个常量值,但在方法内外声明一个常量值没有帮助。

char* e4_strdup( const char*& c )
{
    unsigned int sz{ 0 };
    for ( const char* p_to_c = c; *p_to_c != '\0'; ++p_to_c )
        ++sz;

    char* c_copy{ new char[ sz ] };
    for ( unsigned int i{ 0 }; i < sz; ++i )
        c_copy[ i ] = c[ i ];

    return c_copy;
}

编辑1: 我正在确定通过程序逐步分配的元素数量。

另外,当我通过std :: cout输出返回的指针时,它会输出比原始输入c-string更多的内容。

编辑2: 固定代码。

char* e4_strdup( const char*& c )
{
    unsigned int sz{ 0 };
    for ( const char* p_to_c = c; *p_to_c != '\0'; ++p_to_c )
        ++sz;

    char* c_copy{ new char[ ++sz ] }; // extra space for '\0' character.
    for ( unsigned int i{ 0 }; i < sz; ++i )
        c_copy[ i ] = c[ i ];

    return c_copy;
}

1 个答案:

答案 0 :(得分:3)

它没有分配更多的空间 - 你只是没有复制尾随的\0,所以当你打印字符串时,它会继续超过你正式分配的结尾。欢迎来到未定义行为的世界。

P.S。在复制之前,您需要为尾随\0分配空间,您也不会这样做。