Я реализую функцию 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;
}
После нескольких сбоев я обнаружил, что он работает правильно, когда «сохранить»(ссылка на вики) указатель возвращается, но не когда возвращается «temp». Почему мне нужно возвращать save вместо temp напрямую при работе с указателями (версия массива индексов работает без использования save)?
Внутри указателя функции temp
увеличивается
while((*temp++ = *str++));
Так что если вернуться temp
тогда он не будет содержать начальный адрес выделенной памяти.
Например, эти варианты использования будут недействительными.
char *p = strdup( "Hello World" );
puts( p );
free( p );
Учтите, что в C ++ лучше использовать оператор 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 );
}