C语言系列(五)内存的分配与释放
来源:互联网 发布:洛阳软件培训机构 编辑:程序博客网 时间:2024/06/04 19:10
什么是堆?说到堆,又忍不住说到了栈!什么是 栈?
1、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。
2、什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。
C语言程序编译的内存分配,堆与栈的区别:
- 栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。
堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。再强调一次,记得要释放! - 栈区(stack) :
//windows下,栈内存分配2M(确定的常数),超出了限制,提示stack overflow错误
//编译器自动分配释放,主要存放函数的参数值,局部变量值等; 堆区(heap):程序员手动分配释放,操作系统80%内存
全局区或静态区:存放全局变量和静态变量;程序结束时由系统释放,分为全局初始化区和全局未初始化区;
字符常量区:常量字符串放与此,程序结束时由系统释放;
程序代码区:存放函数体的二进制代码。
栗子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
栈内存
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
堆内存
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
创建一个数组,动态指定数组的大小(在程序运行过长中,可以随意的开辟指定大小的内存,以供使用,相当于Java中的集合)
静态内存分配,分配内存大小的是固定,问题:1.很容易超出栈内存的最大值 2.为了防止内存不够用会开辟更多的内存,容易浪费内存
动态内存分配,在程序运行过程中,动态指定需要使用的内存大小,手动释放,释放之后这些内存还可以被重新使用(活水)
函数:calloc() 分配内存空间并初始化
calloc() 函数用来动态地分配内存空间并初始化为 0,其原型为:
- 1
- 1
calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。
【返回值】分配成功返回指向该内存的地址,失败则返回 NULL。
函数:malloc() 动态地分配内存空间
malloc() 函数用来动态地分配内存空间(如果你不了解动态内存分配,请查看:C语言动态内存分配及变量存储类别),其原型为:
- 1
- 1
应用在程序中代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
realloc 重新分配内存
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
新分配内存的两种情况:
//缩小,缩小的那一部分数据会丢失
//扩大,(连续的)
1.如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针
2.如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据库释放掉,返回新的内存地址
3.如果申请失败,返回NULL,原来的指针仍然有效
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
内存分配的几个注意细节
1.不能多次释放;
2.释放完之后(指针仍然有值),给指针置NULL,标志释放完成;
3.内存泄露(p重新赋值之后,再free,并没有真正释放内存);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
以上就是C语言中对内存的分配与释放,常用的几个函数~
更多系列相关文章传送门:
C语言(一)基本数据类型
C语言(二)有符号数和无符号数的理解
C语言(三)字符串处理函数
C语言(四)指针概念的理解
C语言(六)结构体和联合体
C语言(七)文件的相关操作
转载于:http://blog.csdn.net/u011974987/article/details/52290724
个人主页:xuhaoblog.com
- C语言系列(五)内存的分配与释放
- C语言系列(五)内存的分配与释放
- C语言中的内存分配与释放
- c语言内存分配与释放
- C语言动态内存分配与释放
- C语言中多维数组的内存分配和释放(malloc与free)(转)
- C语言中多维数组的内存分配和释放(malloc与free)
- 内存的分配与释放
- 内存的分配与释放
- 内存的分配与释放
- C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存
- 【C/C++】C语言中一些容易被人忽略的东西 之一 【内存的分配与释放】
- 关于C/C++中内存分配与释放的疑惑?
- C语言的内存分配malloc和释放free(32)
- C语言实现一、二维数组动态内存分配与释放以及图像的线性插值放大与优化
- 读朱兆祺攻破C语言之八---内存分配与内存释放
- c中内存分配与释放(malloc,realloc,calloc,free)函数内容的整理
- C和C++动态内存的申请与释放思考(动态多维数组空间分配)
- 【noip2013提高组day1T3】 货车运输 RMQ+LCA+倍增+最大生成树
- 常用正则表达式归纳
- 2>&1 的用法说明
- iOS开发 ☞ 图片处理
- js中的fromCharCode() charCodeAt() charAt()
- C语言系列(五)内存的分配与释放
- noip2013 华容道 bfs+建图
- Linux学习--gdb调试
- 放弃有道词典和有道云笔记
- 安卓Andriod使用入门(五)【分类侧滑菜单】
- 配置https域名的访问搭建
- C语言系列(六)结构体和联合体
- jquery checkbox的全选和反选
- https与webService区别