C语言-动态内存分配

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值