Для начала имя функции reverse_copy
только сбивает с толку читателей, потому что функция ничего не копирует. Он переворачивает массив на месте.
Так что лучше назвать функцию просто как reverse
.
Во-вторых, функция имеет тип возврата int *
, но ничего не возвращает. Нет смысла объявлять тип возвращаемого значения функции как int *
вместо void
при условии, что функция не выделяет динамически новый массив ..
В результате этот оператор
B = reverse_copy(A, N);
не имеет смысла и вызывает неопределенное поведение.
Вы выделили только один массив, на который указывает указатель A. Указатель B не указывает на вновь динамически размещенный массив. Так что это утверждение
free(B);
снова вызывает неопределенное поведение.
Вот демонстрационная программа, которая показывает, как две функции, reverse
и reverse_copy
, могут быть реализованы с помощью указателей.
#include <stdio.h>
#include <stdlib.h>
void reverse( int *a, size_t n )
{
if ( n != 0 )
{
for ( int *b = a + n; a < --b; ++a )
{
int tmp = *a;
*a = *b;
*b = tmp;
}
}
}
int * reverse_copy( const int *a, size_t n )
{
int *b = NULL;
if ( n != 0 )
{
b = malloc( n * sizeof( int ) );
for ( int *p = b + n; p-- != b; ++a )
{
*p = *a;
}
}
return b;
}
int main(void)
{
int a[] =
{
0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361
};
const size_t N = sizeof( a ) / sizeof( *a );
printf( "Original array: " );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
reverse( a, N );
printf( "Reversed array: " );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
putchar( '\n' );
printf( "Original array: " );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
int *b = reverse_copy( a, N );
printf( "Reversed array: " );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", b[i] );
}
putchar( '\n' );
free( b );
return 0;
}
Вывод программы:
Original array: 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361
Reversed array: 361 324 289 256 225 196 169 144 121 100 81 64 49 36 25 16 9 4 1 0
Original array: 361 324 289 256 225 196 169 144 121 100 81 64 49 36 25 16 9 4 1 0
Reversed array: 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361
Альтернативный и более гибкий подход реализации функции reverse_copy
- предоставить функции уже существующий / выделенный массив.
Вот демонстрационная программа
#include <stdio.h>
#include <stdlib.h>
int * reverse_copy( const int *a, size_t n, int *b )
{
for ( const int *p = a + n; p != a; ++b )
{
*b = *--p;
}
return b;
}
int main(void)
{
int a[] = { 0, 1, 2, 3, 4, 5 };
const size_t N = sizeof( a ) / sizeof( *a );
printf( "Original array: " );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
int *b = malloc( 2 * N * sizeof( int ) );
int *p = reverse_copy( a, N, b );;
for ( const int *q = a; q != a + N; ++q, ++p )
{
*p = *q;
}
printf( "Reversed array: " );
for ( size_t i = 0; i < 2 * N; i++ )
{
printf( "%d ", b[i] );
}
putchar( '\n' );
free( b );
return 0;
}
Вывод программы
Original array: 0 1 2 3 4 5
Reversed array: 5 4 3 2 1 0 0 1 2 3 4 5