我讲解一下c语言中动态分配内存的函数

上传人:宝路 文档编号:22211371 上传时间:2017-11-26 格式:DOC 页数:3 大小:35.62KB
返回 下载 相关 举报
我讲解一下c语言中动态分配内存的函数_第1页
第1页 / 共3页
我讲解一下c语言中动态分配内存的函数_第2页
第2页 / 共3页
我讲解一下c语言中动态分配内存的函数_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《我讲解一下c语言中动态分配内存的函数》由会员分享,可在线阅读,更多相关《我讲解一下c语言中动态分配内存的函数(3页珍藏版)》请在金锄头文库上搜索。

1、我讲解一下 c 语言中动态分配内存的函数 ,可能有些初学 c 语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗?既然有人会问这样的问题,那么我在这里好好的讲解一下吧!首先让我们熟悉一下计算机的内存吧!在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_str=”cgat”;其中”cgat”就储存在字符常量区里面;3 )全局区:在全局区里储存一些全局变量和静态变量;4)堆:堆主要是通过动态分配的储存空间,也就是我们接下需要讲的动态分配内存空间。什么时

2、候我们需要动态分配内存空间呢?举一个例子吧。int *p; 我们定义了一个指向 int 类型的指针 p;p 是用来储存一个地址的值的,我们之所以要为 p这个变量分配空间是让它有一个明确的指向,打个比方吧!你现在做好了一个指向方向的路标,但是你并没有让这个路标指向一个确切的方位,也就是说现在的这个路标是瞎指向的,这样我们就不能够通过它来明确到底哪里是东,哪里是西,何为北,何为南了。虽然我们在计算机的内存里定义了一个指针变量,但是我们并没有让这个变量指示一个确切 int 类型变量的地址,所以我们就必须要让它有一个明确的指示方向。这样我们就要通过动态分配内存的方式来认为的规定它的方向!我们在刚刚接触

3、指针的时候遇到过这样的情况,int *p;p=&a; 这种方法不是指针的动态分配内存,这个叫做指针变量的初始化!初始化同样也可以让指针变量有方向可指。int *p; p=malloc(n*sizeof(类型名称) ;我们通过 malloc()函数为一个指针变量 p 分配了地址,这样我们从键盘上键入的值就这样存储在 p 里面了,接下来我们就可以对这个 p 进行具体的操作了,比如 scanf(“%s” ,p )等等。当我们对 p 结束操作的时候还要释放 p 的内存空间。为什么要释放内存空间呢?在上面我已经讲过动态分配的变量时储存在堆里面,但是这个堆的空间并不是无限大的,也许当我们编一个小的程序的时

4、候可能我们并不能够发现什么,但是对于那些大的程序,如果我们比及时释放堆的空间的时候会放生内存泄露。所谓内存泄露是因为堆的空间北我们动态分配用完了,这样当我们再去使用动态分配堆的空间的时候就没有足够的空间让我们使用了,这样就需要占有原来的空间,也就是会把其他的空间来储存我们键入的值,这样会导致原来储存的数据被破坏掉,导致了内存的泄露了。同时当我们使用 malloc()函数的时候还应该注意当我们释放完空间的时候还要将原先的指针变量赋予一个 NULL,也就是赋予一个空指针,留着下次的时候使用它!如果我们不赋予|NULL 行不行呢?答案是:不行的!如果我们不赋予一个空指针这样会导致原先的指针变量成为了

5、一个野指针!何谓野指针?野指针就是一个没有明确指向的指针,系统不知道它会指向什么地方,野指针是很危险的,因此当我们每次使用完 malloc()函数的时候都必须将指针赋予一个空指针!相对于 malloc()函数,calloc ()函数就不需要我们赋予 NULL了,这是因为在每次调用完 calloc()函数的时候系统会自动将原先的指针赋予一个空指针,即归于“0”。calloc()函数的原型是 void *calloc(count,sizeof(类型名称);比如: p=(char*)calloc(4,sizeof (char);我们为 p 分配了指向 char 型指针的“4” 个空间。除了 mall

6、oc()与 calloc(),还有一个动态分配空间的函数 realloc()函数,这个函数比前两个函数分配更多的空间,原型:void *realloc (void *p,size_t size);该函数有几个作用:1) 如果有足够的空间来扩充 p 的内存块,则返回一个指向 p 的指针;2) 如果没有足够的空间来扩充 p 的内存块,则为 p 从新分配 size 的空间,并把原来的内容复制给 p,指向 p 的开头,同时释放原来的空间,返回一个指向新内存块的指针;3) 如果 p=NULL,其作用于 malloc()相似;下面举一个程序的例子:#define LONG 10#include#inclu

7、de#includemain()char *message,bufLONG;gets(buf);message=(char*)realloc(NULL,strlen(buf)+1);strcpy(message,buf);puts(message);gets(buf);message=(char*)realloc(message,(strlen(message)+strlen(buf)+1);strcat(message,buf);puts(message);return 0;动态分配内存目录基本信息 详细释义编 辑 本 段 基 本 信 息所 谓 动 态 内 存 分 配 (Dynamic Me

8、mory Allocation)就 是 指 在 程 序 执 行 的过 程 中 动 态 地 分 配 或 者 回 收 存 储 空 间 的 分 配 内 存 的 方 法 。 动 态 内 存 分 配 不 象数 组 等 静 态 内 存 分 配 方 法 那 样 需 要 预 先 分 配 存 储 空 间 , 而 是 由 系 统 根 据 程 序的 需 要 即 时 分 配 , 且 分 配 的 大 小 就 是 程 序 要 求 的 大 小 。 编 辑 本 段 详 细 释 义例 如 我 们 定 义 一 个 float 型 数 组 : float score100; 但 是 , 在 使 用 数 组 的 时 候 , 总 有

9、一 个 问 题 困 扰 着 我 们 : 数 组 应 该 有 多 大 ?在 很 多 的 情 况 下 , 你 并 不 能 确 定 要 使 用 多 大 的 数 组 , 比 如 上 例 , 你 可 能 并 不知 道 我 们 要 定 义 的 这 个 数 组 到 底 有 多 大 , 那 么 你 就 要 把 数 组 定 义 得 足 够 大 。这 样 , 你 的 程 序 在 运 行 时 就 申 请 了 固 定 大 小 的 你 认 为 足 够 大 的 内 存 空 间 。 即使 你 知 道 你 想 利 用 的 空 间 大 小 , 但 是 如 果 因 为 某 种 特 殊 原 因 空 间 利 用 的 大 小有 增 加

10、 或 者 减 少 , 你 又 必 须 重 新 去 修 改 程 序 , 扩 大 数 组 的 存 储 范 围 。 这 种 分配 固 定 大 小 的 内 存 分 配 方 法 称 之 为 静 态 内 存 分 配 。 但 是 这 种 内 存 分 配 的 方 法存 在 比 较 严 重 的 缺 陷 , 特 别 是 处 理 某 些 问 题 时 : 在 大 多 数 情 况 下 会 浪 费 大 量的 内 存 空 间 , 在 少 数 情 况 下 , 当 你 定 义 的 数 组 不 够 大 时 , 可 能 引 起 下 标 越 界错 误 , 甚 至 导 致 严 重 后 果 。 我 们 用 动 态 内 存 分 配 就 可

11、 以 解 决 上 面 的 问 题 . 所 谓 动 态 内 存 分 配 就 是指 在 程 序 执 行 的 过 程 中 动 态 地 分 配 或 者 回 收 存 储 空 间 的 分 配 内 存 的 方 法 。 动态 内 存 分 配 不 象 数 组 等 静 态 内 存 分 配 方 法 那 样 需 要 预 先 分 配 存 储 空 间 , 而 是由 系 统 根 据 程 序 的 需 要 即 时 分 配 , 且 分 配 的 大 小 就 是 程 序 要 求 的 大 小 。 从 以 上 动 、 静 态 内 存 分 配 比 较 可 以 知 道 动 态 内 存 分 配 相 对 于 静 态 内 存 分配 的 特 点 :

12、 1、 不 需 要 预 先 分 配 存 储 空 间 ; 2、 分 配 的 空 间 可 以 根 据 程 序 的 需 要 扩 大 或 缩 小 。 要 实 现 根 据 程 序 的 需 要 动 态 分 配 存 储 空 间 , 就 必 须 用 到 malloc 函 数 . malloc 函 数 的 原 型 为 : void *malloc (unsigned int size) 其 作 用是 在 内 存 的 动 态 存 储 区 中 分 配 一 个 长 度 为 size 的 连 续 空 间 。 其 参 数 是 一 个无 符 号 整 形 数 , 返 回 值 是 一 个 指 向 所 分 配 的 连 续 存 储 域 的 起 始 地 址 的 指 针 。还 有 一 点 必 须 注 意 的 是 , 当 函 数 未 能 成 功 分 配 存 储 空 间 ( 如 内 存 不 足 ) 就 会返 回 一 个 NULL 指 针 。 所 以 在 调 用 该 函 数 时 应 该 检 测 返 回 值 是 否 为 NULL 并执 行 相 应 的 操 作 。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号