Версия указателя 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;
}

После нескольких сбоев я обнаружил, что он работает правильно, когда «сохранить»(ссылка на вики) указатель возвращается, но не когда возвращается «temp». Почему мне нужно возвращать save вместо temp напрямую при работе с указателями (версия массива индексов работает без использования save)?

0

Решение

Внутри указателя функции 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 );
}
2

Другие решения


По вопросам рекламы [email protected]