第7讲 动态分配内存-

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例: int * fun ( int a , int b ) { 函数体 ; }
2020/4/13
6.2.2 返回指针值的函数
例2 求某班成绩的平均分 要求用返回指针值的函数实现
分析:
main
通过函数average的返回 &aver1
值得到保存平均分变量的地
p
址, 进而得到平均分, 函数中
将平均分变量定义成静态的,
sum=sum+s;
}
}
aver1=sum/n;
return(aver);
}
2020/4/13
6.6 指针与动态内存分配
动态内存分配(Dynamic Memory Allocation) 在程序运行时为程序分配内存的一种方法
什么时候需要使用动态内存分配?
例: 计算某班英语成绩的平均分,要求保存每个学生的成绩,而学生 人数由键盘输入
2020/4/13
6.6.2 动态内存分配和释放函数
2. calloc( )函数 例: float *p=NULL; p=(float *) calloc (10, sizeof(float));
申请10个连续的float型的存储单元, 并将其首地址赋给float型的 指针变量, 该存储空间总的字节数为10×sizeof(float)
显然,用calloc( )函数开辟的存储空间相当于一个一维数组, 第1个参数决定了一维数组的大小, 第2个参数决定了数组元素 的类型, 函数的返回值就是数组的首地址
2020/4/13
6.6.2 动态内存分配和释放函数
3. free( )函数 函数原型 : void free( void *p );
作用: 释放动态申请的由指针变量p所指向的存储空间, 该函数无返回值 说明: ①参数p的值不是任意的地址, 必须是程序中执行malloc或 calloc函数所返回的地址 ② p是普通指针(void *), 但调用free函数时不需要进行强制 类型转换, 计算机系统会自动转换 ③该函数执行后, 将指针p所指向的存储空间交还给系统, 系统可再重新分配
2020/4/13
2020/4/13
动态数组的实现
2020/4/13
6.6.2 动态内存分配和释放函数
➢使用malloc函数时, 必须用强制类型转换将
返回的指针值转换回所需要的数据类型, 然后
再进行赋值操作
定义指针变量通常将
int *p=NULL;
其初始化为空指针
double *q=NULL; 申请一个长度为4个字节的存储空间,
p= (int *) malloc (4);
这样函数结束后该变量仍然
存在。
average 81 aver1静态
&aver1 aver
2020/4/13
例2 程序代码
float *average(int n)
void main( )
{ int i; float s, *aver, sum=0;
{ int n;
static float aver1;
2020/4/13
6.6.2 动态内存分配和释放函数
ANSI C标准定义了3个动态内存分配函数 需要#include "stdlib.h"
1. malloc( )函数 函数原型:void *malloc( unsigned int size);
作用: 在内存开辟一个长度为 size 个字节的连续的存储空间, 返回一个指向该存储区首地址的指针,若系统不能提供足够 的内存单元(分配失败), 函数将返回空指针NULL 说明: void * 是一种指针类型, 称为无类型指针, 常用来说明其基类 型未知的指针, 即声明一个指针变量, 但不指定它指向哪一种 具体类型的数据
float *p;
aver=&aver1;
静态局部变量 printf("input n:");
for(i=1; i<=n; i++)
scanf("%d",&n);
{ printf("input s:");
p=average(n);
ቤተ መጻሕፍቲ ባይዱ
scanf("%f", &s);
printf("ave=%6.2f, ", *p);
第7讲 动态分配内存
本讲内容: (1)返回指针值的函数 (2)动态内存分配函数 (3)动态数组的实现
2020/4/13
6.2.2 返回指针值的函数
函数的返回值可以是一个指针类型的数据(即地址) 返回指针值函数的定义格式: 函数类型 * 函数名( 形参列表 ) { 函数体; }
说明:定义一个返回指针值的函数与定义普通函数的格式基本 类似,只是在函数名前加 * , 表明该函数返回一个指针值
必须将数组定义的足够大! 我们希望在输入n后,根据实际
int a[60]; int n, i;
的人数定义一个动态数组,这样 不会浪费存储空间
scanf("%d", &n);
for(i=0; i<n; i++) scanf("%d", &a[i]); 如果输入的n较小(15),那么数组 有多数以上的存储空间被浪费了
并将其首地址赋给int型的指针变量, 则该空间可存放int型数据
q= (double *) malloc ( sizeof(double) );
*p=36;
强制类型转换
*q=45.8;
如果不知道某种类型数据 所占内存空间的字节数, 可用sizeof( )进行计算
2020/4/13
6.6.2 动态内存分配和释放函数
int *p=NULL;
double *q=NULL;
p= (int *) malloc (4);
q= (double *) malloc ( sizeof(double) );
*p=36;
*q=45.8;
p 0x0N0U37L1L000
36
0x00371000
q 0x0N0U37L1L048
45.8 0x00371048
2020/4/13
6.6.2 动态内存分配和释放函数
2. calloc( )函数 函数原型: void *calloc(unsigned int num,unsigned int size);
作用: 给若干同一类型的数据项分配连续的存储空间, 其中每 个数据项的长度单位为字节, 若函数调用成功, 返回一个指向 该存储区的首地址, 若函数调用失败返回空指针NULL 说明: 参数num表示向系统申请的存储空间的数量 参数size表示每个存储空间所占的字节数
相关文档
最新文档