进程内存分布

        刚学C不久,整理一些小小资料,希望对学C的朋友能起到一点作用,也巩固一下学习,同时如有说错的地方还望指正。

#include <stdio.h>

#define pi 3.14

int main(int argc,const char* argv[])
{
    pi = pi + 1;
    printf("%f",pi);
}


        进程(Process)是指计算机中已运行的程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
        进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。
        文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
进程的内存分布以及功能特点如下:
低地址    |text         代码段         存储二进制指令和常量 只读 如果修改会产生段错误 大小不限制
               |data       全局数据段  初始化过的全局变量和静态变量 大小不限制
               |bss        静态数据段  未初始化过的全局变量和静态变量,在程序执行前会被初始化为0,所以会有默认值 大小不限制
               |heap        堆              手动管理,这段内存不能和标识符建立映射关系(无法取名), 必须和指针配合使用
               |                                               1.足够大 
               |                                               2.不能自动释放而需要手动释放导致使用麻烦 
               |                                               3.容易产生内存泄漏和内存碎片
高地址    ↓stack        栈            自动管理,自动分配内存,执行结束自动释放
                                                               1.使用方便
                                                               2.栈结构比较安全
                                                               3.不会产生内存泄漏和内存碎片
                                                               4.大小有限所以过大会产生段错误
                                                               5.分配释放不可控不适合长期的数据保存
  由下可以看出,常量存储于text段,只可读不可更改(如下图)

#include <stdio.h>

#define pi 3.14

int main(int argc,const char* argv[])
{
    pi = pi + 1;
    printf("%f",pi);
}

代码一

图片一

        在Linux系统vim编译器预处理(图片一)下我们不难看出pi为常量,且3.14(pi所替换)=3.14(pi所替换)+1显然不成立。
        data和bss分别存放初始化后的静态、全局变量和未初始化过的静态、全局变量(如下图(仅演示全局变量))。

#include <stdio.h>

int main(int argc,const char* argv[])
{
    
}

代码二

图片二

#include <stdio.h>

int Num;

int main(int argc,const char* argv[])
{
    
}

代码三

图片三

#include <stdio.h>

int Num = 100;

int main(int argc,const char* argv[])
{
    
}

代码四

图片四

        图二图三对比可以看出,当我设定一个int类型(4字节)全局变量(未初始化)的时候,bss段数值由4变为了8,增加了4,说明未初始化的全局变量存在于bss段。
        图二图四对比可以看出,当我设定一个int类型(4字节)的全局变量(初始化后)的时候,data段值由272变为276,增加了4,说明初始化后的全局变量存在于data段。
        作为程序员最为熟悉的莫过于堆和栈,堆空间和栈空间的大小是可变的,堆空间从下往上生长(即从低地址向高地址使用),栈空间从上往下生长(即高地址向低地址使用)(如图五所示)它们同时向中心区域未使用的内存挤压。对于作用上述的功能特点里可以查看这里就不在作说明
    


 图片五
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值