程序内存四区

分内存四区是为了更好的管理,提高效率
在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博主,博主只是个纯情小孩子,没吃过猪肉还没见过猪跑吗???哼哼!

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值