C++ 数组为多于请求的元素分配空间

C++ 数组为多于请求的元素分配空间,c++,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 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;
}
char*e4\u strdup(const char*&c)
{
无符号整数sz{0};
for(const char*p_to_c=c;*p_to_c!='\0';++p_to_c)
++深圳;
char*c_copy{new char[sz]};
for(无符号整数i{0};i
编辑1: 我通过单步执行程序来确定分配的元素数量

另外,当我通过std::cout输出返回的指针时,它打印的比原始输入的c字符串多

编辑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;
}
char*e4\u strdup(const char*&c)
{
无符号整数sz{0};
for(const char*p_to_c=c;*p_to_c!='\0';++p_to_c)
++深圳;
char*c_copy{new char[++sz]};//为'\0'字符留出额外空间。
for(无符号整数i{0};i
它没有分配更多的空间-您只是无法复制尾随的
\0
,因此当您打印字符串时,它将继续超过您正式分配的末尾。欢迎来到未定义行为的世界


另外,在复制尾随的
\0
之前,您需要为尾随的
\0
分配空间,您也没有这样做。

您如何确定分配的元素数?为什么不
std::vector
std::copy?
呢?因为这是指针的练习。现在您已经告诉我了,这一点很明显。非常感谢。