初识动态分配

申请内存

1. malloc函数:

a) 使用原因:当我们不知道数组长度时,通过申请内存块而创建一种可以节省内存的做法(动态申请数组)
b) 使用格式

#include<malloc.h>//(malloc在<stdlib.h>中声明)
int *p,*q;//(定位所申请的内存)
P=(int*)malloc(size);//(如果不强制转换就返回无类型指针,指向起始位置;如果内存空间不够分配则返回NULL---意味着对返回的指针检查非空是重要的)
q=p;//(q存放初始地址)
p++;//(下一个数组变量)
free(q);//(释放内存---参数是先前malloc,calloc,realloc返回的指针或者空指针(无影响))

2. calloc函数:

a) 参数:(元素数量,每个元素字节数 )—类型是size_t,它是一个无符号类型在<stdlib.h>
b) 原型:void *calloc(size_t num_elements,size_t element_size);
c) 和malloc区别:是在calloc在返回值指向内存的指针之前把他初始化为0

3. realloc函数:

a) 效果:修改一个原先已经分配的内存块大小,加长时保留原有的数据,新内存在后面未经初始化;缩小时尾部被拿掉但前面的依旧不变;但是使用realloc后应该相应地用realloc返回的新指针。
b) 原型:void realloc(void *ptr,size_t new_size)
c) 特例:当realloc的第一个参数是NULL,行为就和malloc一样申请一个新的连续内存

4.free函数

a)使用效果:释放存储空间
b)原型:void free(void*p);
c)说明易错点
<1>.free的指针参数只能是最后一次调用的malloc或者calloc所返回的地址
eg.下例中所free的是q而非p,是因为执行p++后p已经改变,在执行free会出错

#include<malloc.h>//(malloc在<stdlib.h>中声明)
int *p,*q;//(定位所申请的内存)
P=(int*)malloc(size);//(如果不强制转换就返回无类型指针,指向起始位置;如果内存空间不够分配则返回NULL---意味着对返回的指针检查非空是重要的)
q=p;(q存放初始地址)
p++;//(下一个数组变量)
free(q);//(释放内存---参数是先前malloc,calloc,realloc返回的指针或者空指针(无影响))

<2>.保存数据的空间释放后数据也将不存在,再用指针输出是不可预料的值

使用内存

eg.初始化

**/*创建内存*/**
	int *pi;
    pi=malloc(25*sizeof(int));
    if(pi=NULL){//NULL提示我们测试的是指针而不是整数
	printf(out of memory!\n”);//超出内存池
	exit(1);
}
**/*初始化1*/**
Int *pi2,i;
pi2=pi;
for(i=0;i<25;i++){
*pi2++=0;
}
**/*初始化2*/**
Int i;
for(i=0;i<25;i+=1){
pi[i]=0;
}

动态内存常见错误

  1. 对NULL指针进行解引用操作
  2. 对分配内存操作时越界
  3. 释放非动态分布内存
  4. 试图释放一块动态内存的一部分
  5. 一块动态内存被释放后继续使用
    /注意/
  6. 检查返回的指针不是NULL,确保成功分配了
  7. 操作内存超出了分配内存的边界
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值