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日

相关文章

  • Marshall Monitor II A.N.C.降噪蓝牙耳机30天详细评测

    Marshall Monitor II A.N.C.降噪蓝牙耳机30天详细评测 概述 本文介绍Marshall Monitor II A.N.C.降噪蓝牙耳机的使用体验,并根据30天的长时间使用给出评测。 外观设计 Marshall Monitor II A.N.C.耳机采用了传统的翻盖式设计,整个耳机以黑色为主色调,搭配铜色的镀金LOGO,非常时尚。耳机外…

    C 2023年5月22日
    00
  • C语言链表实现商品库存管理系统

    C语言链表实现商品库存管理系统 简介 链表是一种常见的数据结构,优点是可以在任意位置插入或删除元素,而不影响链表中其他元素。因此,链表在一些需要频繁插入或删除元素的场景中非常适用,比如实现商品库存管理系统。 本文将使用C语言来实现链表,并借此来实现一个简单的商品库存管理系统。在该系统中,我们可以添加商品(包括名称、价格和数量),查看商品,删除商品,以及修改商…

    C 2023年5月23日
    00
  • 比特币真的值得长期持有和投资吗一文弄懂

    “比特币真的值得长期持有和投资吗” 完整攻略 1. 什么是比特币? 比特币是一种基于区块链技术的加密数字货币,由匿名的发明者“中本聪”在2009年发布。比特币的交易和管理是通过去中心化的方式进行,独立于中央机构或政府控制。 2. 比特币的特点 2.1 去中心化 比特币的交易和管理不需要中央机构或政府控制,而是由全球网络的节点共同维护、管理。 2.2 匿名性 …

    C 2023年5月22日
    00
  • C/C++实现精灵游戏的示例代码

    让我来详细讲解一下“C/C++实现精灵游戏的示例代码”的完整攻略。 1. 前置知识 在开始编写精灵游戏的示例代码前,需要掌握以下知识: C/C++基本语法和语言特性; 数据结构和算法知识; 图形学相关知识。 2. 精灵游戏示例代码实现 下面我们通过两个示例说明如何使用C/C++实现精灵游戏的示例代码。 示例一:飞行游戏 首先,我们看一个简单的飞行游戏示例。 …

    C 2023年5月23日
    00
  • C语言实现宿舍管理系统设计

    C语言实现宿舍管理系统设计 1. 项目简介 本项目是一个基于C语言的宿舍管理系统,具有学生管理、宿舍管理、归寝管理、公告管理等多个功能。系统通过命令行界面进行操作,主要针对大学的学生宿舍进行管理。宿舍管理员可以通过此系统方便地对宿舍进行管理,包括学生信息的添加、删除、修改,宿舍信息的查询、修改等。 2. 实现思路 本项目的实现主要包括以下几个部分: 2.1 …

    C 2023年5月23日
    00
  • C/C++中宏定义(#define)

    C/C++中宏定义(#define) 什么是宏定义? 在C/C++中,宏定义是一种预处理指令,用于让编译器在编译源代码之前进行一些简单的文本替换操作。定义完成后,程序中所有出现该定义的地方都会被替换成定义时所指定的文本内容。 宏定义的语法 #define 宏名称 宏取值 其中,“#define”是宏定义的关键字,“宏名称”是您定义的宏名称,“宏取值”则是您希…

    C 2023年5月23日
    00
  • 在C++中反射调用.NET的方法(三)

    介绍: 在C++中,通过COM技术可以调用.NET的方法。但UNIX平台上并不支持COM技术。因此,可以使用反射机制来实现在C++中调用.NET方法的目的。在我的博客中,我介绍了一种方法来实现C++中反射调用.NET方法,即使用Mono运行时库。本文将详细介绍如何使用这个库来完成这个任务。 步骤: 安装Mono运行时库 首先,需要安装Mono运行时库。可以通…

    C 2023年5月23日
    00
  • C语言volatile关键字的作用与示例

    C语言中的volatile关键字可以用于修饰被多线程访问或外部环境影响的变量,以保证程序访问这些变量的正确性。本文将从定义、作用、使用方法以及实例方面全面介绍volatile关键字的使用。 定义 volatile是C语言的关键字,表示“易变的、多变的、易波动的”,即表示一个全局变量或局部变量,其值可能随时会发生改变,因此每次访问该变量时都必须重新读取变量的值…

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