当我执行以下代码时, 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;
}
答案 0 :(得分:3)
它没有分配更多的空间 - 你只是没有复制尾随的\0
,所以当你打印字符串时,它会继续超过你正式分配的结尾。欢迎来到未定义行为的世界。
P.S。在复制之前,您需要为尾随\0
分配空间,您也不会这样做。