strdup 指针版本需要一个临时指针
strdup pointer version needs a temporary pointer
我正在练习实现一个 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) 指针为 return 时它可以正常工作,但当 "temp" 为 return 时则不能编辑。为什么在处理指针时需要 return 保存而不是直接保存临时文件(下标数组版本无需使用保存即可工作)?
在函数指针内 temp
递增。
while((*temp++ = *str++));
所以如果return 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 );
}
我正在练习实现一个 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) 指针为 return 时它可以正常工作,但当 "temp" 为 return 时则不能编辑。为什么在处理指针时需要 return 保存而不是直接保存临时文件(下标数组版本无需使用保存即可工作)?
在函数指针内 temp
递增。
while((*temp++ = *str++));
所以如果return 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 );
}