一、栈内存
操作系统会为每个进程分配一定空间的栈内存,定义的局部变量会存储在自动分配的栈内存中,局部变量使用完毕后
地址会空出来用来再次被分配,但是这个地址所对应的存储内容还是上一次分配时所赋值的内容,不会被擦除,栈内
存是一个反复被覆盖写入而不擦除的的内存。栈内存大小有限,如果要存储大块数据就不要以局部变量的方式存储了。
二、堆内存
以malloc分配的内存为堆内存,需要手动释放。malloc分配并不会每次都成功,若分配成功会返回所分配的首地址
若分配失败返回NULL,所以分配后一定要校验是否分配成功再使用,在没有释放该内存之前千万不要修改首地址的
值,如果修改了就失去了对这段内存的控制权,即产生内存泄漏。
int *p=(int *)malloc(16); //本来想用const修饰p,但是用完后p不能被赋为NULL,可能不规范
if(NULL==p) //注意将NULL写在前面,万一少一个=,p就被赋值了。
p=.... //未释放前千万不要给p赋值
free(p); //释放后就不要再访问这段内存了
p=NULL;
三、数据段
全局变量和static修饰的静态局部变量都是被分配在数据段内存中,全局变量从程序开始就被分配,由操作系统维护
程序正常结束会被自动回收。
三种内存的使用
一、那么需要较大内存时是应该使用全局变量还是使用堆内存呢?
全局变量使用很方便,也不需要程序员去手动释放, 但是这些内存伴随程序的整个生存周期,如果数据在整个程序从头
到尾都要用到,那就要分配到数据段里去。
分配到堆内存里的数据的生命周期为从malloc分配开始到free释放结束.
平时使用时根据数据的属性而定。。
二、一些特殊数据会被放到代码段
1. char *p="linux";
如果这样定义的话,linux这串字符会被放到代码段,放到代码段里的内容是无法被修改的
2.一些单片机程序编译器会把const修饰的数据放到代码段里来防止数据被修改
三、一个程序运行过程中所分配的这三种内存会在程序结束后被操作系统回收