该功能并不像乍一看那样简单。
给你。
#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