##存储管理##
1.内存组织方式
开发人员将程序编写完成之后,程序要先装载到i计算机的内核或者半导体内存中,再运行程序。程序被组织成4个逻辑段:a.可执行代码,b.静态数据(可执行代码和静态数据存储在固定的内存位置),c.动态数据(堆),d.栈(局部数据对象、函数的参数以及调用函数的联系放在称为桟的内存池中)。
2.堆与桟
通过内存组织方式,堆用来存放动态分配内存空间,而桟用来存放局部数据对象、函数的参数以及调用函数和被调用函数的联系。
#堆
在内存的全局存储空间中,用于程序动态分配和释放的内存块称为自由存储空间,即堆。c中,是用malloc函数和free函数来从堆中动态地分配和释放内存。
#桟
桟是一个后进先出的压入弹出式的数据结构。在程序运行时,需要每次向桟中压入一个对象,然后桟指针向下移动一个位置。当系统从桟中弹出一个对象时,最晚进桟的对象将被弹出,然后桟指针向上移动一个位置。如果桟指针位于桟顶,则表示桟是空的;如果桟指针指向最下面的数据项的后一个位置,则表示桟为满的。
3.动态管理
a.malloc函数
在stdilb.h头文件中包含该函数,作用是在内存中动态地分配一块size大小的内存空间。malloc函数会返回一个指针,该指针指向分配的内存空间,如果出现错误则返回NULL。
函数原型:
void *malloc(unsigned int size);
注意:使用malloc函数分配的内存空间是在堆中,而不是在栈中。因此在使用完这块i内存之后一定要将其释放掉,释放内存空间使用的是free函数。
b.colloc函数
在stdlib.h头文件中包含该函数,函数的功能书在内存中动态分配n个长度为size的连续内存空间数组。calloc函数会返回一个指针,该指针指向动态分配的连续内存空间地址。当分配空间错误时,返回NULL。
函数原型:
void *calloc (unsigned n,unsigned size);
第一个参数表示分配数组中元素的个数,而第二个参数表示元素的类型。eg:pArray=(int*)calloc(3,sizeof(int));
c.realloc函数
包含在头文件stdlib.h,其功能书改变ptr指针指向的空间大小为size大小。设定的size大小可以是任意的。返回值是一个指向新地址的指针,如果出现错误则返回NULL。
函数原型:
void *realloc (void *ptr,size_tsize);
eg:fDouble=(double*)malloc(sizeof(double));
ilnt=realloc(fDouble,sizeof(int));
d.free函数
该函数的功能是使用由指针ptr指向的内存区,使部分内存区内被其他变量使用。ptr是最近一次调用calloc或malloc函数时返回的值,free函数无返回值。
函数原型:
void free(void *ptr);
4.内存丢失
在使用malloc等函数分配内存后,要对其使用free函数进行释放。因为内存不进行释放会造成内存遗漏,从而可能会导致系统崩溃。free函数的用处在于实时地执行回收内存的操作。一般当程序结束后,操作系统会将完成释放的功能,但建议实时回收内存,防止过度占用系统内存,影响系统的性能,导致系统因此可能崩溃。若开辟的虚拟空间因为指针的所指的地址丢失,从而无法正常free该虚拟空间,则称为内存丢失。
1.内存组织方式
开发人员将程序编写完成之后,程序要先装载到i计算机的内核或者半导体内存中,再运行程序。程序被组织成4个逻辑段:a.可执行代码,b.静态数据(可执行代码和静态数据存储在固定的内存位置),c.动态数据(堆),d.栈(局部数据对象、函数的参数以及调用函数的联系放在称为桟的内存池中)。
2.堆与桟
通过内存组织方式,堆用来存放动态分配内存空间,而桟用来存放局部数据对象、函数的参数以及调用函数和被调用函数的联系。
#堆
在内存的全局存储空间中,用于程序动态分配和释放的内存块称为自由存储空间,即堆。c中,是用malloc函数和free函数来从堆中动态地分配和释放内存。
#桟
桟是一个后进先出的压入弹出式的数据结构。在程序运行时,需要每次向桟中压入一个对象,然后桟指针向下移动一个位置。当系统从桟中弹出一个对象时,最晚进桟的对象将被弹出,然后桟指针向上移动一个位置。如果桟指针位于桟顶,则表示桟是空的;如果桟指针指向最下面的数据项的后一个位置,则表示桟为满的。
3.动态管理
a.malloc函数
在stdilb.h头文件中包含该函数,作用是在内存中动态地分配一块size大小的内存空间。malloc函数会返回一个指针,该指针指向分配的内存空间,如果出现错误则返回NULL。
函数原型:
void *malloc(unsigned int size);
注意:使用malloc函数分配的内存空间是在堆中,而不是在栈中。因此在使用完这块i内存之后一定要将其释放掉,释放内存空间使用的是free函数。
b.colloc函数
在stdlib.h头文件中包含该函数,函数的功能书在内存中动态分配n个长度为size的连续内存空间数组。calloc函数会返回一个指针,该指针指向动态分配的连续内存空间地址。当分配空间错误时,返回NULL。
函数原型:
void *calloc (unsigned n,unsigned size);
第一个参数表示分配数组中元素的个数,而第二个参数表示元素的类型。eg:pArray=(int*)calloc(3,sizeof(int));
c.realloc函数
包含在头文件stdlib.h,其功能书改变ptr指针指向的空间大小为size大小。设定的size大小可以是任意的。返回值是一个指向新地址的指针,如果出现错误则返回NULL。
函数原型:
void *realloc (void *ptr,size_tsize);
eg:fDouble=(double*)malloc(sizeof(double));
ilnt=realloc(fDouble,sizeof(int));
d.free函数
该函数的功能是使用由指针ptr指向的内存区,使部分内存区内被其他变量使用。ptr是最近一次调用calloc或malloc函数时返回的值,free函数无返回值。
函数原型:
void free(void *ptr);
4.内存丢失
在使用malloc等函数分配内存后,要对其使用free函数进行释放。因为内存不进行释放会造成内存遗漏,从而可能会导致系统崩溃。free函数的用处在于实时地执行回收内存的操作。一般当程序结束后,操作系统会将完成释放的功能,但建议实时回收内存,防止过度占用系统内存,影响系统的性能,导致系统因此可能崩溃。若开辟的虚拟空间因为指针的所指的地址丢失,从而无法正常free该虚拟空间,则称为内存丢失。