C语言中的动态内存分配,是用指针实现的。主要用到的有下面4个函数。
1 malloc()
使用范例:
int *pNumber=(int *)malloc(20*sizeof(int));
if(pNumber!=NULL)
{
/*Code*/
}
该语句给20个int类型的数据分配内存,把内存块的地址赋予pNumber。
注意:
malloc()返回的是一个void 类型的指针,(int )将返回的地址转换为int类型的指针;
malloc()的参数是要分配的内存字节数;
sizeof是一个运算符,返回一个size_t类型的无符号整数,该整数是存储它的参数需要的字节数;
如果因某些原因未能分配请求的内存,malloc()会返回一个NULL指针。
2 calloc()
使用范例:
int *pNumber=(int *)calloc(20,sizeof(int));
if(pNumber==NULL)
{
printf("fail!");
return 1;
}
calloc()需要两个参数:数组的元素个数和数组元素占用的字节数。
calloc()与malloc()相比有两个优点:
(1)它把内存分配为给定大小的数组;
(2)它初始化了所分配的内存,所有的位都是0。
3 free()
使用范例:
free(pNumber);
free()的作用是释放动态分配的内存。
free()的形参是void *型,所有指针类型都可以转化为该类型。
应避免两次释放相同的内存区域。因为在这种情况下,free()函数的操作是不确定的,因此也就无法预料。
4 realloc()
realloc()函数可以重用前面通过malloc()或calloc()或realloc()分配的内存。
realloc()需要两个参数:一个是指针,它包含前面调用malloc(),calloc(),realloc()返回的地址;另一个是要分配的新内存的字节数。
realloc()函数释放第一个指针参数引用的之前分配的内存,然后重新分配该内存区域,以满足第二个参数制定的新请求。第二个参数的值不应超过以前分配的字节数。
pNumber=(int *)realloc(10,sizeof(int));
5 应用范例
学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。 现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1到n 编号,i 号同学的接水量为wi。接水开始时,1 到m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k马上接替j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j 同学第x 秒结束时完成接水,则k 同学第x+1 秒立刻开始接水。若当前接水人数n’不足m,则只有n’个龙头供水,其它m−n’个龙头关闭。 现在给出n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。
样例输入1[复制]
5 3
4 4 1 2 1
样例输出1[复制]
4
样例输入2[复制]
8 4
23 71 87 32 70 93 80 76
样例输出2[复制]
163
#include<stdio.h>
int min_arr( int *, int );
int max_arr( int *, int );
int main( )
{
int n = 0; /*person number*/
int m = 0; /*hydrant number*/
scanf( "%d %d", &n, &m );
int *water_arr = ( int * ) malloc( n * sizeof( int ) );
int *time_arr = ( int * ) malloc( m * sizeof( int ) );
if( water_arr != NULL && time_arr != NULL )
{
for( int i = 0; i < n; i ++ )
scanf( "%d", water_arr + i );
for( int i = 0; i < m; i ++ )
time_arr[i] = water_arr[i];
for( int i = m; i < n; i ++ )
{
int temp = min_arr( time_arr, m );
time_arr[temp] += water_arr[i];
}
int result = time_arr[ max_arr( time_arr, m ) ];
printf( "%d", result );
free( water_arr );
free( time_arr );
}
else
{
printf( "error!" );
}
return 0;
}
int min_arr( int *arr, int count )
{
int position = 0;
for( int i = 1; i < count; i ++ )
position = arr[position] < arr[i] ? position : i;
return position;
}
int max_arr( int *arr, int count)
{
int position = 0;
for( int i = 1; i < count; i ++ )
position = arr[position] > arr[i] ? position : i;
return position;
}