轻松学C语言之动态内存管理以及变量的
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
管理ppt
12
如果我们对动态分配的存储空间不合适,可以使用 realloc()函数重新分配动态存储空间,其调用形式以 及说明如图13.12所示。
调用形式 realloc(p,size);
说明
p:p为一个指针变量,指向需重新分配空间 size:分配的空间的大小 返回值:成功,返回重新后的存储的空间的首地址; 失败返回空指针NULL 作用:为p指向的存储空间分配大小为size的存储空 间,并返回重新分配后的存储空间的首地址
2
#include <stdio.h> #include <string.h> int main(void) {
char s[80];
strcpy(s,"hello");
for(int i=0;i<5;i++) printf("%c", s[i]); return 0; }
字符数组定义时系统已 经为其分配相应的内存
管理ppt
8
calloc()函数实现在内存的动态存储区域中分配n个 长度为size的连续存储空间。它的调用形式以及说 明如图13.6所示。
调用形式 calloc(n,size);
说明
size:它的类型为整型,代表存储空间字节数 n:类型为int型,代表分配了n个长度为size的连续 存储空间 返回值:申请成功,函数返回一个指针,它指向所 分配空间的其实地址;申请失败,返回空指针NULL 作用:在内存的动态存储区分配一个长度为size的 连续存储空间。
管理ppt
9
p=(int *)malloc(sizeof(int) *n); 分配了n个存放整型数据的存储空间
管理ppt
10
当动态分配的存储空间已经不再被使用时,我们应
该释放掉它,把它交还给系统,使系统可以重新对 其分配。C语言中,对于释放动态分配的存储空间 我们使用free()函数,其调用形式以及说明如图13.9 所示。
把字符串复制到字符数组中
s="hello"
管理ppt
3
缺点 数组的大小是固定的
数组需要一块连续的内存空间
说明 所以它所占的空间在内存分配之后的运行期间是不能改 变的,所以这样就要求我们事先为其分配较大的空间, 保证程序运行时不会溢出
如果对于一个系的各班定义一个数组,每个班的学生个 数不一定相同,那么就很难定义数组的长度。过大会造 成资源的浪费,过小又会造成溢出,影响程序的运行
管理ppt
13
注意点 重新分配后的空间新地址位置 重新分配后的空间回收
解释 新的首地址不一定与原来定义的首地址相同, 因为为了增加空间,存储区会进行必要的移 动 由realloc()函数分配的空间,也可以利用 free()函数回收,以避免内存空间的浪费
管理ppt
14
前面所讲的是关于内存动态分配空间,而在在程序 设计中我们是直接指定了分配内存大小空间。但是 这样不利于程序的可移植性,因为在不同的计算机 系统中,统一数据类型所占用的内存空间不一致, 为了解决这个问题,C语言提供了一个判断数据类 型长度的操作符——sizeof。sizeof对于数据类型的 操作如图13.14所示。
管理ppt
1
C语言中,只运行使用系统分配的内存,如果系统 没有为变量分配内存,那么会出现什么情况呢?如 图13.1所示。
char *p; strcpy(p,"hello");
指针变量没有被初始化
把字符串复制到没有初始化 的指针变量指向的地址中
它指向的地址是任意的
系统没有分配内存
编译错误
管理ppt
C语言中,动态内存分配也就是在程序运行中实时 申请内存分配。这有利于我们对任意多的数据进行
处理。如果这些数据不用了,我们也可以随时释放。 对于变量的存储有4种存储类别:auto(自动)、 register(寄存器)、static(静态)和extern(外 部)。本章主要讲解动态内存管理以及变量的4种 存储类别。
别是数据在内存中存储的方式。存储方式分为两大 类:动态存储类与静态存储类。具体包含4种:自 动的(auto)、静态的(static)、寄存器的 (register)、外部的(extern)。根据变量的存储 类别,可以知道变量的作用域和生存期。
管理ppt
16
内存中的供用户使用的存储空间可以分为三部分, 如图13.16所示。
sizeof使用形式 sizeof(type_name);
说明 判断数据类型type_name的空间大小
代码示例
/*分配5个整型数据的空间*/ int *pn=(int *)malloc(5*sizeof(int));
管理ppt
15
C语言中,每一个变量和函数都有两个属性:数据 类型和存储类别。数据类型大家已经熟悉,存储类
调用形式 free(指针变量);
说明
参数:参数“指针变量”指向最近一次调用函数 malloc()或者calloc()时分配的连续存储空间的首地址 返回值:无返回值 作用:free()函数将已分配的内存区域交还系统,使系 统可以重新对其进行分配
管理ppt
11
int a[10]; …
free(a);/*代码错误,释放不了,数组a的存储空间不是动态分配的存储空间*/
管理ppt
4
程序为使用的数据实 时申请内存空间
程序运行 程序对数据 释放内存空间 运行结束
管理ppt
5
当我们要进行动态内存分配时,我们首先要进行内 存分配。当程序对分配的内存空间执行完毕后,我 们要将分配的空间释放掉,从而提高了内存空间的 利用率。但是,当我们分配的内存不够使用时,我 们需要重新分配存储空间。本节主要讲解怎样解决 这一系列的问题。
管理ppt
6
我们使用动态存储区域分配存储空间可以使用以下 2个函数实现:malloc()函数、calloc()函数。
管理ppt
7
实现动态存储区域分配空间的函数malloc(),其调用 形式以及参数说明如图13.4所示。
调用形式 malloc(size);
说明
size:实参的类型为整型 返回值:申请成功,函数返回一个指 针,它指向所分配空间的起始地址; 申请失败,返回空指针NULL 作用:在内存的动态存储区分配一个 长度为size的连续存储空间。
内存单元
用户区
程序区 静态存储区 动态存储区
管理ppt
17
Βιβλιοθήκη Baidu
定义 静态存储方式