C语言动态内存管理

   C系统的函数库中提供了了程序动态申请和释放内存存储块的库函数,下面将分别介绍。

        1、malloc   函数

             a、该函数的原型:void *malloc(size_t size);

             b、该函数只有一个参数,且形参size是无符号整型,该参数代表申请空间的字节数。

             c、返回值:如果内存池中的可用内存满足需求,malloc返回一个指向被分配内存块起始位置的指针;如果内存池中的可用内存不能满足需求,则返回一个NULL指针。

             d、malloc所分配的是一块连续的内存。

        注:  微笑   malloc实际分配的内存有可能比你的请求稍微多一点,但这个行为是由编译器定义的。

                 微笑   malloc申请内存空间时,有可能内存池时空的或它的可用内存无法满足你的需求,在这种情况下,malloc函数会向操作系统请求,要求得到更多的内存,并在这块新内存上执行分配任务;如果操作系统无法向malloc提供更多的内存,malloc会返回NULL指针。

                 微笑   malloc函数申请到的这块内存并没有以任何方式进行初始化。如果对这块内存初始化非常重要,那就要自己手动进行初始化。

                 微笑   如果想将malloc返回的指针赋给其他类型的指针变量,应当进行显式的转换(强制类型转换)。

                 eg:  用malloc开辟一个长度为6的内存空间:malloc(6),如果系统分配的此段空间的起始地址为78243,则malloc(6)的函数返回值为78243.

                        如果想把以上地址赋给一个指向long型的指针变量p,则应进行以下显式转换(轻质类型转换):

p=(long*)malloc(6).

        2、calloc  函数

              a、该函数的原型:void *calloc(size_t num_elements,size_t element_size);

              b、该函数有两个参数,第一个参数表示申请元素的个数,第二个参数表示元素类型所占的字节数。

              c、返回值:同malloc函数。

       注:  微笑 calloc返回指向内存的指针之前就把它初始化为0。这个初始化很方便,但是如果程序只是想把一些值存储到数组中,那么这个过程就很浪费时间。

                  eg:可用calloc(20,15)开辟20个(每个大小为15字节)的空间,总长为300字节。

        3、realloc  函数

              a、该函数的原型:void * realloc(void *ptr,size_t new_size)

              b、该函数有两个参数,第一个参数表示指针,第二个参数表示调整(申请)空间的字节数。

              c、返回值:同malloc函数。(还是有一点点区别,具体见“注”)

              d、该函数用于修改一个原先已经分配的内存块的大小。

         注:微笑 如果该函数用于扩大一个内存块,那么这块内存原先的内容依然保留,新增加的内存添加到原先内存块的后面,新内存并未以任何方式进行初始化。

                微笑  如果该函数用于缩小一个内存块,该内存块尾部的部分内存便被拿掉,剩余部分内存的原先内容依然保留。

                微笑  如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的块上。因此,使用realloc后,就不能使用旧内存的指针,而应该改用realloc所返回的新指针。

        4、free 函数

             a、该函数的原型:void free(void *pointer)

             b、该函数的参数要么是NULL,要么是先前从malloc、calloc或realloc返回的值。

             c、该函数无返回值。

             d、作用:释放malloc、(或calloc、realloc)函数给指针变量分配的内存空间的函数。
        注:   微笑  该函数使用后该指针变量一定要重新指向NULL,防止野指针出现,有效规避误操作。
                  微笑  该函数的参数pointer的值不能是任意的地址项,只能是由malloc、(或calloc、realloc)函数返回的地址。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值