strdup指针版本需要一个临时指针

时间:2015-07-11 18:29:25

标签: c++ pointers c-strings strdup

我实施了一个strdup功能作为练习。

char* strdupPtr(const char* str) {
    const size_t sz{strlen(str)+1};
    char *save, *temp;
    save = temp = (char*)malloc(sz);
    while((*temp++ = *str++));  // compiler warning with only 1 set of   parenthesis
    return save;
}

经过几次失败后,我发现它在返回" save" (wiki reference)指针时正常工作,但在" temp"退回。为什么在处理指针时需要直接返回save而不是temp(下标数组版本在不使用save的情况下工作)?

1 个答案:

答案 0 :(得分:2)

在函数指针temp内递增。

while((*temp++ = *str++));  

因此,如果要返回temp,则它将不包含已分配内存的起始地址。

例如,这些用例无效。

char *p = strdup( "Hello World" );

puts( p );

free( p );

考虑到在C ++中最好使用operator new。 例如

char * strdupPtr( const char *s ) 
{
    char *p = new char[std::strlen( s ) + 1];

    std::strcpy( p, s );

    return p;
}

或者你甚至可以写

char * strdupPtr( const char *s ) 
{
    char *p = new char[std::strlen( s ) + 1];

    return std::strcpy( p, s );
}