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

strdup pointer version needs a temporary pointer

本文关键字:指针 一个 版本 Strdup      更新时间:2023-10-16

我正在实现一个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;
}

经过几次失败后,我发现当"保存"(wiki参考)指针返回时,它可以正常工作,但当"temp"返回时却不行。为什么我需要在处理指针时直接返回save而不是temp(下标数组版本无需使用save)?

在函数指针中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 );
}