В этих операторах
(a->items[0])=(a->items[a->size]);
(a->items[a->size])=tmp;
вы получаете доступ к памяти за пределами выделенного массива, поскольку действительный верхний индекс равен a->size - 1
.
Вместо уменьшения члена данных size
на один
a->size=a->size-1;
Вы должны уменьшить его на два.
a->size=a->size-2;
Кроме того, функция изменяет значения элементов данных size
и items
исходного объекта, переданных в качестве аргумента. Поэтому после выхода из функции состояние исходного объекта будет изменено.
И это выражение
a+1
не имеет смысла, поскольку вы передали функции указатель на один объект тип Tarray
.
Функция может выглядеть следующим образом, как показано в демонстрационной программе ниже.
#include <stdio.h>
#include <stdlib.h>
typedef struct Sarray
{
int *items;
size_t size;
} Tarray;
void ArrayReverse ( Tarray *t )
{
if ( ! ( t->size < 2 ) )
{
int tmp = t->items[0];
t->items[0] = t->items[t->size - 1];
t->items[t->size - 1] = tmp;
t->size -= 2;
++t->items;
ArrayReverse( t );
t->size += 2;
--t->items;
}
}
int main(void)
{
Tarray t = { 0 };
size_t n = 5;
t.items = malloc( n * sizeof( int ) );
if ( t.items != NULL ) t.size = n;
for ( size_t i = 0; i < t.size; i++ )
{
t.items[i] = ( int )( i + 1 );
}
ArrayReverse( &t );
for ( size_t i = 0; i < t.size; i++ )
{
printf( "%d ", t.items[i] );
}
putchar( '\n' );
free( t.items );
return 0;
}
Выход программы:
5 4 3 2 1