内存管理
前言:为何进行内存管理? 程序运行时,需要将数据存放在内存空间中给程序使用。在软件开发中,常需要动态分配和撤销内存空间,例如对动态链表中的结点进行插入和删除,就需要对内存进行管理。
目录: 1.内存的组织方式 2.堆 3.栈
1.内存的组织方式
当我们编程好一个程序后,程序需要先转载进计算机的内存中,然后再被运行,程序被组织成4个逻辑段。 1.可执行代码 2.静态数据:可执行代码和静态数据,存储在固定的内存位置。 3.动态数据(堆):请求动态分配和释放的内存的内存池成为堆,也称为自由储存空间。 4.栈:局部数据对象、程序的参数、调用函数和被调用函数放在称为栈的内存池中。
2.堆
2.1malloc函数分配某一类型变量的内存空间
动态分配一段内存空间
int *p;
p=(int*) malloc (sizeof(int));
*p=100
printf("%d\n",*p);
malloc函数分配内存成功后会返回一个指针,因为分配的是一个int型空间,所以返回的也要是整型指针,所以我们要用(int* )进行强制类型转换,最后将函数返回的指针赋值给指针p,就可以保存动态分配的整型空间地址了。
2.2calloc函数动态分配连续内存空间数组。
这里用calloc函数分配一个数组,然后再用malloc函数分配一个数组,使得大家比较calloc函数和malloc函数的使用。
int *p;
p=(int*) calloc (3,sizeof (int));
int *b;
b=(int*) malloc (sizeof(int[3]));
malloc函数:不能初始化所分配的内存空间,在动态分配完内存后,里边数据是随机的垃圾数据。
calloc函数:能初始化所分配的内存空间,在动态分配完内存后,自动初始化该内存空间为零。
2.3realloc函数改变p指针指向空间大小
realloc函数的功能是改变指针指向大小为size的空间,设定的size可以是任意的,可以比原来大,也可以比原来小,返回值是指向一个新地址的指针,如果出现错误,则返回NULL。
int *t;
double *p =(double*) malloc (sizeof (double));
t=realloc(p,size(int));
p是指向分配浮点型的空间,使用realloc函数后改变p指向的空间大小,其大小设置为整型,然后改变后的内存空间地址返回赋值给t整型指针。
free函数内存回收
该函数的功能可以释放由 malloc()、calloc()、realloc() 等函数申请的内存空间。
int *p;
p=(int*) malloc (sizeof(int));
free (p);
关于内存泄漏 在使用malloc等函数分配内存后,要对其使用的free函数进行释放,因为内存不进行释放会造成内存泄漏。例如当运行大型程序时,可能某个程序要重复使用一万次10MB的内存,那将使用100GB的内存,如果用free函数,那将只需要10MB。同时也有可能会有丢失内存的情况,这个不详细展开。
栈
栈不需要像处理堆那样,在栈中显示分配的内存。当程序调用函数和申明变量时,系统将自动分配内存。 栈是一个后进先出的压入弹出式数据结构。在程序执行时,每次向栈中压入一个对象后,栈指针向下移动一个位置。当系统从栈中弹出一个对象时,最后进栈的对象将会被弹出,然后栈指针向上移动一个位置。如果栈指针位于栈顶,说明栈是空的,如果栈在栈底,说明栈式满的。
|