内存之管理

内存管理

前言:为何进行内存管理?
程序运行时,需要将数据存放在内存空间中给程序使用。在软件开发中,常需要动态分配和撤销内存空间,例如对动态链表中的结点进行插入和删除,就需要对内存进行管理。

目录:
1.内存的组织方式
2.堆
3.栈

1.内存的组织方式

当我们编程好一个程序后,程序需要先转载进计算机的内存中,然后再被运行,程序被组织成4个逻辑段。
1.可执行代码
2.静态数据:可执行代码和静态数据,存储在固定的内存位置。
3.动态数据(堆):请求动态分配和释放的内存的内存池成为堆,也称为自由储存空间。
4.栈:局部数据对象、程序的参数、调用函数和被调用函数放在称为栈的内存池中。

2.堆

2.1malloc函数分配某一类型变量的内存空间

动态分配一段内存空间

int *p;              //首先定义一个整型指针来保存分配内存的地址。
p=(int*) malloc (sizeof(int));   //使用malloc分配大小为int(4个字节)的内存空间
*p=100              //使用该空间保存数据
printf("%d\n",*p);//输出数据  为100

malloc函数分配内存成功后会返回一个指针,因为分配的是一个int型空间,所以返回的也要是整型指针,所以我们要用(int* )进行强制类型转换,最后将函数返回的指针赋值给指针p,就可以保存动态分配的整型空间地址了。

2.2calloc函数动态分配连续内存空间数组。

这里用calloc函数分配一个数组,然后再用malloc函数分配一个数组,使得大家比较calloc函数和malloc函数的使用。

int *p;
p=(int*) calloc (3,sizeof (int));   //使用calloc动态分配一个长度为12个字符的整型数组
int *b;
b=(int*) malloc (sizeof(int[3]));  //使用malloc动态分配一个长度为12个字符的整型数组

malloc函数:不能初始化所分配的内存空间,在动态分配完内存后,里边数据是随机的垃圾数据。

calloc函数:能初始化所分配的内存空间,在动态分配完内存后,自动初始化该内存空间为零。

2.3realloc函数改变p指针指向空间大小

realloc函数的功能是改变指针指向大小为size的空间,设定的size可以是任意的,可以比原来大,也可以比原来小,返回值是指向一个新地址的指针,如果出现错误,则返回NULL。

int *t;
double *p =(double*) malloc (sizeof (double));  //利用malloc分配一个长度为8个字节的内存空间
t=realloc(p,size(int));       //p是指向分配浮点型的空间,使用realloc函数后改变p指向的空间大小。

p是指向分配浮点型的空间,使用realloc函数后改变p指向的空间大小,其大小设置为整型,然后改变后的内存空间地址返回赋值给t整型指针。

free函数内存回收

该函数的功能可以释放由 malloc()、calloc()、realloc() 等函数申请的内存空间。

int *p;              //首先定义一个整型指针来保存分配内存的地址。
p=(int*) malloc (sizeof(int));   //使用malloc分配大小为int(4个字节)的内存空间
free (p);            //释放该内存空间,释放内存空间后,想再输出*p时,将输出一个不可意料的值,因为这个数据已经不存在了

关于内存泄漏
在使用malloc等函数分配内存后,要对其使用的free函数进行释放,因为内存不进行释放会造成内存泄漏。例如当运行大型程序时,可能某个程序要重复使用一万次10MB的内存,那将使用100GB的内存,如果用free函数,那将只需要10MB。同时也有可能会有丢失内存的情况,这个不详细展开。

栈不需要像处理堆那样,在栈中显示分配的内存。当程序调用函数和申明变量时,系统将自动分配内存。
栈是一个后进先出的压入弹出式数据结构。在程序执行时,每次向栈中压入一个对象后,栈指针向下移动一个位置。当系统从栈中弹出一个对象时,最后进栈的对象将会被弹出,然后栈指针向上移动一个位置。如果栈指针位于栈顶,说明栈是空的,如果栈在栈底,说明栈式满的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值