我实施了一个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的情况下工作)?
答案 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 );
}