Программа имеет неопределенное поведение, поскольку вы выделяете недостаточно памяти для строки результата.
char* mystrdup(const char* c)
{
int size = strlength(c);
char* result = new char;
^^^^^^^^^^^^^^^^^^^^^^^
copy(c, c + size, result);
return result;
}
Более того, вы не копируете конечный ноль в строку результата.
По крайней мере две функции strlength
и mystrdup
могут выглядеть следующим образом
size_t strlength( const char *s )
{
size_t size = 0;
while ( s[size] ) ++size;
return size;
}
char * mystrdup( const char *s )
{
size_t size = strlength( s ) + 1;
char *result = new char[size];
copy( s, s + size, result );
return result;
}
Конечно, вместо стандартного алгоритма std::copy
вы можете использовать стандартную C функцию strcpy
, объявленную в заголовке <cstring>
.
strcpy( result, s );
И не забудьте удалить выделенный массив.
char* res = mystrdup(test);
//…
delete [] res;
Обратите внимание, что функция print_array
не использует переменную size
. Нет необходимости выводить C -строку за символом.
Функция может быть определена как
std::ostream & print_array( const char *s, std::ostream &os = std::cout )
{
return os << s;
}
И, наконец, идентификатор c
обычно используется с одиночным объекты типа char
. Если вы имеете дело со строкой, то лучше использовать идентификатор s
.