C/C++程序代码的五大内存分区

在讲分区前,我们首先要了解程序运行的四个过程:
在这里插入图片描述

  1. 预编译
    预编译主要完成以下三个具体任务:
    (1)把include中的头文件复制到要编译的源文件中
    (2)用实际值代替define文本
    (3)在调用宏的地方进行宏替换

  2. 编译
    编译的主要功能包括两个部分,第一部分是检查代码的语法,如果语法错误则给出错误提示并结束编译,只有在代码无语法错误的情况下才能进入大二部分。第二部分是将预编译后的文件转换为汇编语言。

  3. 汇编
    汇编的主要功能是将汇编语言代码变成目标代码(机器代码),但不进行连接,并生成目标文件,即二进制文件。

  4. 连接
    连接的主要功能是连接目标代码,并生成可执行文件。

五大内存分区分别是:栈区,堆区,BSS区,数据区,代码区

  1. 栈区
    由编译器自动分配释放,存放函数的参数值、返回值和局部变量,在程序运行过程中实施分配和释放,栈区由操作系统自动管理,无需程序员手动管理。

  2. 堆区
    堆是由malloc()函数或者new分配的内存块,使用free或delete来释放内存,堆的申请和释放由程序员控制,容易导致内存泄漏,导致后面代码无法访问这片内存区域,程序退出后系统自动回收。

  3. BSS区
    即Block Started by Symbol,存放的是未初始化的全局变量和未初始化的静态变量。

  4. data区
    即数据区,存放已初始化的全局变量、静态变量和常量数据。

  5. 代码区
    存放cpu执行的机器指令,代码区是可共享,并且是只读的。

以下是从网上找的一个例子,看例子能够更直观的了解各行代码在内存中的处在哪个区,代码如下

#include <QCoreApplication>
#include <iostream>
#include<unistd.h>
using namespace std;
int a=0;    //在data区,已初始化的全局变量 
char *p1;   //在BSS区,未初始化的全局变量
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    int b;      //栈区,临时变量
    char s[] = "asd";     //栈区,临时变量
    char *p2 = "123";     //123是字符串常量,在data区,p2在栈区
    static int c = 0;    //c是已初始化静态变量,在data区
    const int d = 0;     //栈区,const修饰的变量对存放位置没有影响不要被误导!!!
    static const int e;    //data区
    p1 = (char *)malloc(10);//分配10个字节在堆区
    return a.exec();
}

补充:

  • static全局变量和普通全局变量的区别:
    static全局变量只初始化一次,只能在当前文件下使用
    普通全局变量可以在别的文件中加extern使用
  • static局部变量和普通局部变量的区别:
    static局部变量只被初始化一次,下一次使用的初始值为上一次的结果值
    普通局部变量如果在函数中或者在循环中,当函数或者循环结束后也就被回收
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值