Я пишу эту функцию, чтобы вернуть указатель char перевернутой строки.
void * PreverseStr (char str[])
{
int size = strlen (str);
char *returnstr = (char *)malloc (size * sizeof(char));
for (int i = size - 1; i >= 0 ; i--)
{
*returnstr = str[i];
returnstr ++;
}
returnstr = 0;
returnstr -= size;
return returnstr ;
}
Чтобы проверить эту функцию, я написал основную функцию, подобную этой
int main()
{
char str[] = "abcdefghijklmnopqrstuvwxyz";
char *newstr = PreverseStr(str);
printf("Reversed string using pointer: %s\n", newstr);
free(newstr);
return 0;
}
Но он падает, не успев ничего распечатать. Интересно, что не так с моим кодом. Было бы очень полезно, если бы вы могли объяснить исправление этого.
Попробуйте просто сохранить исходный указатель, а затем восстановить его после запуска цикла. См. replit.com/@robertwharvey/…. Или просто верните сохраненный указатель.
Я почти уверен, что вы хотели написать *returnstr = 0
. Тем не менее, 10 секунд в отладчике должны сделать предельно очевидным то, что происходит.
@Useless, компилятор не выдает никаких предупреждений, и я еще не знаю, как использовать отладчик. Но проблема решена. Спасибо всем
Компилятор не обязан предупреждать вас об этом, и никогда не рано научиться пользоваться отладчиком!
Для начала возвращаемый тип void *
не имеет смысла. Тип возвращаемого значения должен быть char *
. Поскольку функция создает новую строку без изменения исходной строки, параметр функции должен иметь квалификатор const
.
Это выделение памяти
char *returnstr = (char *)malloc (size * sizeof(char));
выделяет недостаточно места для хранения завершающего нулевого символа '\0'
исходной строки.
Вам нужно написать хотя бы
char *returnstr = (char *)malloc ( ( size + 1 ) * sizeof(char));
После цикла for указатель returnstr
указывает за пределы выделенной памяти, потому что она увеличивается в цикле.
returnstr ++;
Более того, после этого задания
returnstr = 0;
он становится нулевым указателем.
Функция может быть объявлена и определена следующим образом
char * reverse_copy( const char s[] )
{
size_t n = strlen( s );
char *p = malloc( n + 1 );
if ( p != NULL )
{
p += n;
*p = '\0';
while ( n-- )
{
*--p = *s++;
}
}
return p;
}
Вот демонстрационная программа.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverse_copy( const char s[] )
{
size_t n = strlen( s );
char *p = malloc( n + 1 );
if (p != NULL)
{
p += n;
*p = '\0';
while (n--)
{
*--p = *s++;
}
}
return p;
}
int main( void )
{
const char *s = "Hello, World!";
puts( s );
char *p = reverse_copy( s );
if (p) puts( p );
free( p );
}
Его вывод
Hello, World!
!dlroW ,olleH
Да, я сделал много ошибок. Спасибо что подметил это
@HibikiSupersanta Нет. Мы, новички, должны помогать друг другу. :)
returnstr = 0;
недействителен. Вы в основном установили указатель на ноль.