C++程序的五大内存分区实例详解

当我们编写C++程序时,系统会默认给程序分配内存,这些内存被分为五个不同的区域,每个区域用途不同,下面我们来详细介绍一下这五个区域的作用。

代码区(文字常量区)

代码区主要用来存放程序的执行代码,这部分内存是只读的,并且在程序启动时就已经固定分配好了。在一个C++程序中,所有的函数、语句都被转换成了二进制码,并被存储在代码区中。代码区还包括存储在程序中的字符串常量,如常量字符串 “Hello, world!”就是存储在代码区中的。

示例:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char* str = "Hello World!";
    cout << str << endl;
    return 0;
}

在上面的代码中,我们定义了一个字符指针类型的变量 str,它指向字符串常量 “Hello World!” 。由于字符串常量存储在代码区中,str 指向的是只读的内存区域,无法修改。但可以通过这个指针来读取这个字符串。

全局(静态)区

全局区又叫作静态区,它用来存储全局变量、静态变量以及常量,它在程序启动时就已经被分配好了空间,直到程序结束才被释放。

在C++程序中,所有在函数外定义的变量都被存储在全局区中。当然,你可以通过 static 关键字在函数内部定义静态变量,这些静态变量也会存储在全局区中。

示例:

#include<iostream>
using namespace std;
int global = 10; //全局变量

void fun(){
    static int static_var = 20; //静态变量
    cout<<"global in fun:"<<global<<endl;
    cout<<"static_var in fun:"<<static_var<<endl;
}

int main(){
    int local = 30; //局部变量
    fun();
    cout<<"global in main:"<<global<<endl;
    return 0;
}

在上述代码中,变量 global 在函数外定义,存储在全局区;变量 static_var 在函数内使用 static 关键字定义,也存储在全局区。函数 fun() 被调用时,它能够访问全局区中的变量,输出变量 global 和 static_var 的值。

栈区

栈区是存放程序中局部变量和函数参数的内存区域,栈区内存的分配方式是先进后出,所以也叫作后进先出栈。在程序执行过程中,每次函数调用都会把函数的参数、返回地址以及函数内部的局部变量等信息压入栈中。

示例:

#include<iostream>
using namespace std;
int add(int x, int y)
{
    int z = x + y;
    return z;
}

int main()
{
    int a = 10, b = 20, c;
    c = add(a, b);
    cout << "a + b = " << c << endl;
    return 0;
}

在上面的代码中,变量 a、b、c 都是存储在栈区中的局部变量,函数 add() 中的参数、变量 z 也是存储在栈区中。每次函数调用时,都会分配一些内存空间来存储函数内部的变量。

堆区

堆区也叫动态内存分配区,它是由程序员自己分配和释放的一块内存区域。当程序需要在运行时动态分配一块内存来存储某些数据时,就需要使用堆区。

示例:

#include<iostream>
using namespace std;
int main()
{
    int *p;
    p = new int;   //分配一个整型变量大小的内存
    *p = 10;       //给分配的内存赋值
    cout << *p << endl;  //输出值
    delete p;      //释放分配的内存
    return 0;
}

在上面的示例中,我们使用 new 操作符分配了一个整型变量大小的内存空间,然后使用指针变量 p 来保存分配的内存地址。我们可以使用 *p 来存取这一块内存,最后通过 delete 操作符释放内存。

常量区

常量区是专门存储常量的一块内存区域。常量区中的数据在程序运行期间是不能被修改的,通常包括程序中定义的只读变量和常量等。

示例:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    const char *str = "I love coding!";
    cout << str << endl;
    return 0;
}

在上述代码中,我们使用 const 关键字将一个字符指针指向一个字符串常量,这个字符串常量存储在常量区,只能读取,无法修改。

以上是五个不同的内存分区,需要注意的是,栈和堆是动态分配存储空间的区域,需要程序员自己负责管理。同时,也应该明确区分五个不同的内存分区的作用,以便编写正确的程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++程序的五大内存分区实例详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • c++读写文件流实例程序讲解

    C++读写文件流实例程序讲解 1. 概述 C++中,通过文件流(fstream)可以方便地进行文件读写操作。文件流不仅可以读写文本文件,还可以读写二进制文件。对于程序开发中需要处理的大量数据,文件读写操作显得尤为重要。 本文将详细讲解如何在C++中使用文件流进行文件读写操作。 2. 文件流的基本操作 C++文件流中,主要有三种文件流类型:ifstream、o…

    C 2023年5月23日
    00
  • LG G4c怎么样 LG G4c参数配置介绍

    LG G4c怎么样 LG G4c参数配置介绍 LG G4c是一款由LG电子公司生产的安卓智能手机,以下将对其进行详细介绍。 硬件参数 LG G4c采用了5英寸IPS LCD显示屏,分辨率为720 x 1280像素,并搭载了四核心1.2 GHz Cortex-A53处理器。这款手机拥有1GB RAM和8GB ROM,设备支持MicroSD卡扩展。此外,LG G…

    C 2023年5月23日
    00
  • win7系统开机屏幕显示0xcoooo428错误怎么办 解决方法介绍

    win7系统开机屏幕显示0xcoooo428错误怎么办 当你开机启动 Win7 时,出现 0xcoooo428 错误提示,显示计算机系统有异常,无法正常启动。那么该如何解决这个问题呢? 问题原因 0xcoooo428 错误常见于电脑开机时,操作系统加载失败。这通常与硬件设备驱动程序损坏或异常、系统文件缺失或损坏等有关。在确定问题原因后,我们可以采用以下方法来…

    C 2023年5月23日
    00
  • Mysql环境变量配置方式

    Mysql环境变量配置方式是方便我们在任意位置执行mysql命令行操作的一种方式。下面是完整的攻略: 步骤1:下载并安装Mysql 下载Mysql的安装程序,按照提示完成安装 步骤2:设置环境变量 打开计算机系统的高级系统设置 选择环境变量,然后在系统变量中找到Path,并点击编辑按钮 在编辑环境变量的弹窗中,点击New按钮,添加Mysql安装目录的bin路…

    C 2023年5月24日
    00
  • Python编程实现数学运算求一元二次方程的实根算法示例

    Python编程实现数学运算求一元二次方程的实根算法示例 一、前置知识 在实现求解一元二次方程的实根之前,需要掌握以下数学知识: 一元二次方程的标准格式:$ax^2+bx+c=0$ 一元二次方程的求根公式:$x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}$ 二、实现原理 在Python中,可以通过以下步骤实现一元二次方程的实根求解: 从用户…

    C 2023年5月22日
    00
  • c++ vector对象相关总结

    C++ Vector对象相关总结 什么是Vector? Vector是C++标准库中的一个动态数组容器,可自动管理其大小(即内存分配和释放),支持快速随机访问。 动态数组顾名思义就是可以动态增长的数组。和普通数组不同之处在于,普通数组在定义时需要明确指定数组大小,而动态数组则可以在运行时根据需要改变大小。 Vector的使用方法 首先需要包含头文件。 1.定…

    C 2023年5月22日
    00
  • 如何在TC2.0中调用汇编程序

    当我们需要使用汇编语言实现某些特定的功能,或者需要使用一些特殊的指令时,可以考虑在TC2.0中调用汇编程序。下面是在TC2.0中调用汇编程序的详细攻略: 1. 创建汇编源文件 首先,需要创建一个汇编文件,以实现所需的功能。在Windows环境中,可以使用文本编辑器或者IDE,比如Notepad++,来创建汇编文件。以MASM语法为例,文件的扩展名应为.asm…

    C 2023年5月23日
    00
  • 把其他C/C++编译器集成到VC2005中的方法

    将其他C/C++编译器集成到VC2005中,可以方便地拥有多个编译器的优势,使得编译更加高效、灵活,并且可以在不同的开发环境中进行快速切换。 下面是把其他C/C++编译器集成到VC2005中的方法: 第一步:获取其他编译器 在集成其他编译器之前,必须首先获取相应的编译器。常见的C/C++编译器有GCC、Clang、Intel C++等。在此以获取GCC为例,…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部