动态内存函数的介绍

1.malloc和free
(1) malloc
malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。
void
malloc(size_t size);
这个函数向内申请一块连续可用的空间,并返回指向这块空间的指针

如果开辟成功,则返回一个指向开辟好空间的指针。
如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
如果参数size为0,malloc的行为是标准是未定义的,取决于编译器。

include<stdio.h>
#include <stdio.h>
int main(){
int *p =  (int *p)malloc(sizeof(int) * 10);
if(p != NULL){
for(int i = 0; i < 10; i++){
  p[i] = i;
  }
  }
  free(p);
  ptr = NULL;  // 更加安全,可突出代码的问题
//这样就开辟了一个内存单元为40个字节的连续空间.
//注意每次开辟完后要先判空,防止开辟失败。
//并且每次使用完malloc()后要free。

system("pause");
return 0;
]

(2)free
释放malloc(或calloc、realloc)函数给指针变量分配的内存空间。
注意:使用后该指针变量一定要重新指向NULL,防止野指针出现,有效规避错误操作
void free (void* ptr);

如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。
如果参数ptr是NULL指针,则函数什么事都不做。

在这里就要提出一个内存泄漏的问题了,如果为释放malloc开辟的空间则会产生内存泄漏。

int *p =  (int *p)malloc(sizeof(int) * 10);
if(p != NULL){
return  0;
}
//这就是明显的内存泄漏

、后果
1.后果特别严重,导致内存在反复的申请过程中被耗尽,后续再申请就会申请失败,导致程序最终崩溃。
2.潜伏期很长,不同的程序内存泄漏速度不一样,如果泄漏速度慢,程序就会运行一段时间之后耗尽。
3.一旦发作,极难调试,虽然市面上有一些内存泄漏检测工具,只能起到一个聊胜于无的效果。
4.预防起来非常复杂,防不胜防。

尽可能避免内存泄漏
1.对于c++来说,可以使用智能指针来一定程度上的解决这个问题。
2.对于java等大部分现代编程语言来说,使用垃圾回收机制(GC)

2calloc()
在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
void* calloc (size_t num, size_t size);

函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0。
与函数malloc的区别只在于calloc会在返回地址之前把申请的空间的每个字节初始化为全0。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *p = calloc(10, sizeof(int));  //他已经初始化了值全为0.
    if(NULL != p)
  {
        //使用空间
    }
    free(p);
    p = NULL;
    return 0;
}

3.realloc
realloc函数的出现让动态内存管理更加灵活。
有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我
们一定会对内存的大小做灵活的调整。那realloc函数就可以做到对动态开辟内存大小的调整。 函数原型如
下:
void* realloc (void* ptr, size_t size);

ptr是要调整的内存地址
size 调整之后新大小
返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。
realloc在调整内存空间的是存在两种情况:
情况1:原有空间之后有足够大的空间
情况2:原有空间之后没有足够大的空间

情况1 当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使
用。这样函数返回的是一个新的内存地址。 由于上述的两种情况,realloc函数的使用就要注意一些。 举个例子:
#include <stdio.h>
int main()
{
    int *ptr = malloc(100);
    if(ptr != NULL)
    {
         //业务处理
    }
    else
    {
         exit(EXIT_FAILURE);    
    }
    //扩展容量
    //代码1
    ptr = realloc(ptr, 1000);

    //代码2
    int*p = NULL;
    p = realloc(ptr, 1000);
    if(p != NULL)
    {
        ptr = p;
    }
    //业务处理
    free(ptr);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值