Функция не так проста, как кажется на первый взгляд.
Вот и вы.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
typedef struct
{
int *tab;
int size;
} arr;
int changeSizeDyn( arr *Dyn_arr, int size )
{
int success = 1;
if ( Dyn_arr->size != size )
{
int *tmp = NULL;
if ( size != 0 )
{
tmp = malloc( size * sizeof( int ) );
success = tmp != NULL;
if ( success )
{
int n = 0;
if ( Dyn_arr->size != 0 )
{
n = size < Dyn_arr->size ? size : Dyn_arr->size;
memcpy( tmp, Dyn_arr->tab, n * sizeof( int ) );
}
if ( n < size ) memset( tmp + n, 0, ( size - n ) * sizeof( int ) );
}
}
if ( success )
{
free( Dyn_arr->tab );
Dyn_arr->tab = tmp;
Dyn_arr->size = size;
}
}
return success;
}
int main( void )
{
arr a = { NULL, 0 };
int size = 10;
if ( changeSizeDyn( &a, size ) )
{
for ( int i = 0; i < size; i++ ) a.tab[i] = i;
for ( int i = 0; i < size; i++ ) printf( "%d ", a.tab[i] );
putchar( '\n' );
}
size = 5;
if ( changeSizeDyn( &a, size ) )
{
for ( int i = 0; i < size; i++ ) a.tab[i] = i;
for ( int i = 0; i < size; i++ ) printf( "%d ", a.tab[i] );
putchar( '\n' );
}
size = 0;
if ( changeSizeDyn( &a, size ) )
{
for ( int i = 0; i < size; i++ ) a.tab[i] = i;
for ( int i = 0; i < size; i++ ) printf( "%d ", a.tab[i] );
putchar( '\n' );
}
assert( a.tab == NULL && a.size == 0 );
}
Выход программы:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4
Функция имееттип возврата int
, чтобы указать, был ли его вызов успешным или нет.Вам нужен метод, чтобы определить, был ли вызов функции успешным.Иначе это невозможно будет определить.Поэтому использовать тип void
в качестве возвращаемого типа функции - плохая идея.
Функция по умолчанию устанавливает все новые элементы, которые не соответствуют элементам старого массива, на ноль.На самом деле это не является необходимым, но делает использование структуры более понятным.
Если пользователь передает размер, равный 0, то функция просто освобождает старый массив и устанавливает элемент данных tab
равным NULL
.
Если новый размер и старый размермассив равен друг другу, функция ничего не делает.
Примите во внимание, что намного лучше объявить элемент данных size
структуры как имеющий тип size_t
.В противном случае вам нужно добавить в функцию проверку, что size
не является отрицательным.Я этого не делал, потому что полагаю, что вы действительно будете использовать тип size_t
вместо типа int
в объявлении структуры (и функции).