程序内存四区
分内存四区是为了更好的管理,提高效率
在C语言程序中:
代码在内存中进行执行的时候,我们粗略的将程序所占用的内存分为四个区域—-栈区,堆区,全局区,代码区,每个程序都有唯一的四个内存区域.我们需要熟悉和了解各个区域的特性,例如存储什么类型的数据, 有谁去申请开辟, 又有谁去管理释放等等
根据是局部变量,全局变量, 常量还是通过malloc等类似的函数分配内存空间, 把他们放到对应的内存区中.这样就赋予了这些变量或常量不同的生命周期, 不同的释放方式. 根据我们程序的需要,我们在编码过程中,声明不同的变量类型, 使他们有不同的声明长度, 不同的释放方式,给我们更大的灵活编程
<-- 栈区 !--> (临时区,当函数执行完毕的时候,自动释放)
由编译器自动分配释放, 存放函数的参数值,局部变量等.
例如:参数buf,参数buf和size都是存放在栈区.当函数执行完毕的时候,自动释放
void recev(char* buf, int bufsize){
int size;
}
<-- 堆区 !-->(需要及时释放,可能会内存泄漏)
一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收
例如:下面的src所指向的内存空间就是在堆区
char* src = (char*) malloc(siz eof(buf) * sizeof(10));
<-- 代码区 !--> (静态区)
全局变量和静态变量存放在此. 里面细分有一个常量区, 字符串常量和其他常量也存放在此. 该区域是在程序结束后由操作系统释放.
<-- 全局区 !-->)(主要是指函数,不由我们关心,是交给操作系统托管的)
这个区域存放函数体的二进制代码.是由操作系统进行管理的
例如下面子程序(mian.cpp):
int a = 0;//全局初始化区
char *p1;//全局未初始化区
int main()
{
int b; //栈区
char s[] = "abc";//栈区
char *p2;//栈区
char *p3 = "123456";//p3在栈区,123456/0在文字常量区(全局区)
static int c = 0;//静态初始化区(全局区)
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得来的10和20字节得区域就在堆区。
strcpy(p1,"123456");// 123456/0放在常量区,编译器可能会将它与p3所指向得"123456"优化成一个地方。
}
全局区的代码调用过程:
栈和堆的生长方向:
栈:从大(地址)到小(地址);
堆:从小(地址)到大(地址);
栈区堆区形象化解释:
栈区就相当于自己去客栈点了一个小妞,干完即走,拔屌无情。不用操心理会那个妞前后的事情,离开的那一刻就相当于自动释放。
堆区就相当于自己去政府领了一个老婆,日日惯养,夜夜伺候。需要处理彼此的日常,去离婚就相当于释放内存的一个过程。
----------------------------不要yy博主,博主只是个纯情小孩子,没吃过猪肉还没见过猪跑吗???哼哼!