C语言动态内存管理

动态内存分配

基本步骤:

  • 用malloc类的函数分配内存;
  • 用这些内存支持运用;
  • 用free函数释放内存,防止内存泄漏;
//申请一个Int空间
int * pi=(int*)malloc(sizeof(int));  
*pi=5; //使用空间
printf("*pi:%d",*pi);
free(pi);  

内存泄漏

原因:

  • 丢失地址
    pi指针重复赋值,致使丢失前面的内存地址。
int * pi=(int*)malloc(sizeof(int)); //丢失
.......
int * pi=(int*)malloc(sizeof(int)); 
char* name=(char*)malloc(strlen("jack")+1);
strcpy(name,"jack");
while(*name!=0)
{
  pritnf("%C",*name);
  name++;
 }   
//最后name指向NUL字符,分配内存的起始地址丢失。
  • 隐式内存泄漏
    忘记用free释放不用的内存。

动态内存分配的函数

  • malloc
  • realloc
  • calloc
  • free
函数描述
malloc从堆分配内存
realloc在之前分配的内存块基础上,将内存重新分配
calloc从堆上分配内存并且清零
free将内存块返回堆

使用malloc函数

void * malloc(size_t);

malloc从堆上分配一块内存,字节数由其唯一参数决定,返回值为void指针(首字节地址),如果内存不足,就会返回NULL,此函数不会清空或者修改内存,新分配的内存里面可能包含垃圾数据。

注意:
初始化静态和全局变量时不能用malloc

static int *pi=malloc(sizeof(int));  (×)

static int *pi;
pi=malloc(sizeof(int));  (√)

使用calloc函数

calloc会在分配的同时清空内存。

void*calloc(size_t num,size_t size);

int * pi=calloc(5,sizeof(int));//(1)

int * pi=malloc(5*sizeof(int));//(2)
memset(pi,0,5*sizeof(int));
//calloc 函数会根据两个参数的乘积来分配空间
//(1)==(2)

使用realloc函数

void * realloc(void *ptr,size_t size);
//重新分配内存。
//ptr是指向原来内存块的指针.
//size是请求的大小
//返回值是重新分配的内存的指针
第一个参数行为
非空0原来的内存被释放了
非空比原来的内存小利用当前的块分配更小的块,多余的内存还给堆
非空比原来内存大要么在当前位置要么在堆的其它区域分配并把旧的内存复制到新的区域

使用free函数释放内存

void free(void*ptr);
ptr=NULL;

释放后,要将释放的指针赋值为NULL,解决迷途指针。

  • 迷途指针
    内存已经释放,而指针还在引用原始内存,这样的指针就称为迷途指针。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值