C/C++中哪些数据存放于栈区、堆区、静态区、常量区的详细说明

news2024/9/21 4:29:45

文章目录

  • 1. 栈区(Stack)
  • 2. 堆区(Heap)
  • 3. 静态区(Static)
  • 4. 常量区(Read-Only or Constant Section)
  • 总结:
  • 栈(Stack)的生长:
  • 堆(Heap)的生长:
  • 测试
    • 一答案
    • 二答案

1. 栈区(Stack)

栈区用于存放局部变量和函数调用信息,它的内存由编译器自动分配和释放,具有自动管理的特点。栈区的内存分配遵循先进后出的原则,生命周期是非常短暂的。

存储内容:

局部变量(例如函数中的局部变量、参数)
函数的返回地址、调用信息
临时对象(比如函数返回值、临时创建的变量

特点:
自动管理:栈上的变量在函数结束时自动释放,不需要显式的内存管理。
高效:栈的分配和释放效率很高,通常通过直接的指针调整完成。
生命周期短:栈上变量的生命周期限于作用域,出了作用域即被释放。

2. 堆区(Heap)

堆区用于存放程序运行时动态分配的内存,程序员需要手动管理(分配和释放)。C++中可以通过new分配堆内存,通过delete释放。

存储内容:
动态分配的内存,如通过new分配的对象或数组。

特点:
手动管理:需要显式使用new分配内存,delete释放内存,防止内存泄漏。
灵活性:堆上的内存可以在程序运行时根据需求动态分配,存储的数据不受作用域限制,可以在多个函数之间共享。

3. 静态区(Static)

静态区用于存放全局变量、静态变量(static关键字修饰的变量)和静态成员变量。这些变量在程序开始时分配内存,并在程序结束时释放,具有全局的生命周期。

存储内容:
全局变量:即作用域为整个程序的变量。
静态变量:局部静态变量在第一次进入所在函数时初始化,并且在后续调用中保留其值。
静态成员变量:类的static成员,属于类而非实例对象。

特点:
全局生命周期:静态区中的变量在程序运行期间始终存在,直到程序结束才被释放。
一次性初始化:静态变量在程序运行时或第一次使用时初始化,且仅初始化一次。

4. 常量区(Read-Only or Constant Section)

常量区用于存放程序中不可修改的常量数据。这个区域通常是只读的,防止程序试图修改这些常量,任何修改尝试都会导致程序异常(如段错误)。

存储内容:
字符串常量:例如const char* str = “hello”;中的"hello"字符串存放在常量区。
const修饰的全局变量:如const int a = 10;(注意:const修饰的局部变量在栈区)。
编译器决定存储的常量数据:编译器可能将某些不变的常量数据(如浮点数、整型常量等)放在常量区。

特点:
只读:程序无法修改常量区的内容,通常对这些区域的写操作会导致运行时错误。
共享性:常量区的数据可以被多个函数或模块共享,不重复存储。

总结:

在这里插入图片描述
下面是自己画的简易图:

栈区以及堆区旁边蓝色的箭头表示两者的生长方向
栈:从内存的顶部(高地址)开始,逐渐向下(低地址)分配内存。
堆:从内存的底部(低地址)开始,逐渐向上(高地址)分配内存。

在这里插入图片描述

栈(Stack)的生长:

生长方向:栈一般是向下生长的,即从高地址向低地址增长。这种分配是由编译器自动管理的,栈主要用于存储局部变量、函数调用帧(包括函数参数、返回地址等)。
分配与释放:栈上的内存分配和释放是自动的,随着函数的调用与返回,内存会自动进行分配和回收。比如,当进入一个函数时,该函数的局部变量会被分配到栈上;当函数执行结束时,栈上的内存会自动释放,不需要手动管理。
特点:
内存分配效率高,因为是连续的。
容量有限,一般有固定的大小,如果超过栈的容量,就会导致栈溢出(Stack Overflow)。

堆(Heap)的生长:

生长方向:堆的生长方向通常是向上生长的,即从低地址向高地址增长。堆内存是通过动态内存分配函数(如 malloc、free,或者在C++中使用 new、delete)进行管理的。
分配与释放:堆上的内存需要手动管理,程序员必须显式地进行分配和释放。如果没有及时释放内存,可能会导致内存泄漏(memory leak)。另外,如果反复分配和释放内存,还可能产生内存碎片,降低内存使用效率。

特点:
堆的大小仅受系统可用内存的限制,理论上可以动态扩大。
动态分配的内存灵活性强,但内存分配速度比栈慢。
需要小心管理,否则容易出现内存管理错误,比如忘记释放内存导致内存泄漏。

测试

下面分享一道例题,方便读者自己进行测试

在这里插入图片描述
在这里插入图片描述

一答案

globalVar在哪里?
选项:C. 数据段(静态区)
全局变量(globalVar)是在数据段(静态区)分配内存的。

staticGlobalVar在哪里?
选项:C. 数据段(静态区)
静态全局变量(staticGlobalVar)也是在数据段(静态区)分配内存。

staticVar在哪里?
选项:C. 数据段(静态区)
静态局部变量(staticVar)在数据段(静态区)分配内存,并且生命周期贯穿整个程序执行。

localVar在哪里?
选项:A. 栈
局部变量(localVar)是在栈上分配的,它的生命周期仅限于函数调用期间。

num1在哪里?
选项:A. 栈
局部数组(num1)也是在栈上分配的。

char2在哪里?
选项:A. 栈
字符数组(char2)是在栈上分配的。

*char2在哪里?
选项:A. 栈
char2 是字符数组的名称,它在栈上分配,因此它的内容也在栈上。

pChar3在哪里?
选项:A. 栈
指针 pChar3 是局部变量,在栈上分配。

*pChar3在哪里?
选项:D. 代码段(常量区)
pChar3 指向的是一个字符串常量 “abcd”,而字符串常量存储在代码段(常量区)。

ptr1在哪里?
选项:A. 栈
指针 ptr1 是局部变量,存储在栈上。

*ptr1在哪里?
选项:B. 堆
ptr1 指向的是通过 malloc 动态分配的内存,存储在堆上。

二答案

sizeof(num1) = 40
num1 是一个包含 10 个 int 元素的数组。在大多数系统中,int 占用 4 字节,因此数组占用 40 字节(4 * 10 = 40)。

sizeof(char2) = 5
char2 是一个字符数组,包含 “abcd” 和终止字符 \0。因此,sizeof(char2) 返回 5。

strlen(char2) = 4
strlen(char2) 计算的是字符串 “abcd” 的长度,不包括终止字符 \0,所以返回 4。

sizeof(pChar3) = 8(在 64 位系统上)
pChar3 是一个指针,在 64 位系统上,指针的大小是 8 字节。如果是 32 位系统,则为 4 字节。

strlen(pChar3) = 4
pChar3 指向字符串常量 “abcd”,strlen(pChar3) 返回 4。

sizeof(ptr1) = 8(在 64 位系统上)
ptr1 是一个指针,大小为 8 字节(在 64 位系统上)。如果是 32 位系统,则为 4 字节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2144720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js中apply,call,bind的区别与用法

在JavaScript中,所有的函数再被调用的时候都会默认传入两个参数,一个是this,还有一个是arguments。在默认情况下this都是指当前的调用函数的对象。但是有时候我们需要改变this的指向,也就是说使函数可以被其他对象来调用&#xff…

【数据可视化】Arcgis api 4.x 专题图制作之分级色彩,采用自然间断法(使用simple-statistics JS数学统计库生成自然间断点)

1.效果 2.实现 2.1 分级色彩 分级色彩是在GIS制图中,通过不同颜色等级来表示数据量级差异的符号化方法,帮助用户直观识别和比较数据的大小。 2.2 分级方法 在GIS中进行分级色彩制图时,可以选择不同的分级方法来表示数据的分布和变化&#xf…

好用又便宜的电商分账系统

多部门联合治税的背景下,合规运营是企业的首要任务。确保税务合规不仅能避免法律风险,还能提升企业的信誉和运营效率,电商分账系统是电商行业必备的合规工具。今天,商淘云为您分享选择性价比高的电商分账系统的三大规则&#xff0…

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现 ​ 首先我们有个Splash 过渡页面来判断当前是用户是否登录,我们先从preferences中获取token是否存在。如果不存在直接跳转登录即可,如果存在的情况我们再去获取下用户的信息看看token是否过期…

探索音乐的新边界——AI写歌的奇妙呈现

在音乐的世界里, 创新总是令人充满期待。 对于没有创作灵感、毫无创作水平的小孩,走进一个充满惊喜的音乐平台 —— (Suno) 看看AI 写歌的神奇魅力。S为我们提供了一个丰富多彩的音乐世界, 从新歌推荐到各种风格的音…

Vmware虚拟机无法打开内核设备“\\.\Global\vmx86“的解决方法

我的问题是在一次系统更新后,导致虚拟机无法使用的。我的虚拟机只有方法三解决了问题。 一、方法一 以管理员身份打开cmd,依次执行以下命令: net start vmci net start vmx86 net start VMnetuserif二、方法二 按 WinR 键,运行…

用好这几个AI抠图工具,既省心又省力!

在设计、摄影和数字创作的世界里,抠图虽然常见,却往往让人感到繁琐。不过,随着人工智能的飞速发展,许多可爱的AI抠图工具应运而生,轻松高效地解决了这一难题!下面就来看看几款超级实用的AI抠图工具&#xf…

Python “字符串操作” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

本文主要是作为Python中列表的一些题目,方便学习完Python的元组之后进行一些知识检验,感兴趣的小伙伴可以试一试,含选择题、判断题、实战题、填空题,答案在第五章。 在做题之前可以先学习或者温习一下Python的列表,推荐…

Qt 学习第九天:标准对话框 页面布局

系统标准对话框 错误对话框 //错误对话框connect(createPro, &QAction::triggered, this, []{//参数1 父亲 参数2 标题 参数3 对话框内显示文本内容 。。。QMessageBox::critical(this, "报错!", "没加头文件!");}); 【运行结果】 信息对话框 co…

使用arduino玩基于esp8266的nodemcu开发板

一、简介 中秋节到图书馆看书,看到了arduino方面的书籍,里面有提到ESP8266模块。让我想起我抽屉里吃灰很久了的基于esp8266的nodemcu开发板。于是把书借回家研究了一下。这里做个记录。 二、我目前在使用的云服务器推荐 学Linux不搞个云服务器始终感觉…

【笔记】进制转换

文章目录 一、任意进制转十进制1、整数转化成十进制(1)二进制转十进制(2)八进制转十进制 2、小数转化成十进制(1)二进制转十进制(2)八进制转十进制 3、代码1、整数转化成十进制2、小…

使用 Vue 3 和 TypeScript 实现带打字效果的仿 AI 分析展示组件

在这篇博客中,我将分享如何用 Vue 3 和 TypeScript 实现一个带打字效果的 AI 分析展示组件。该组件具有如下功能: 动态打字效果:模拟打字机逐步显示内容。自动滚动:内容超出容器高度时自动滚动到最新位置。 1. 组件实现需求 我…

【读点论文】Text Recognition in the Wild: A Survey 非常纯粹的OCR研究,专业细致,脉络清晰

Text Recognition in the Wild: A Survey 文本的历史可以追溯到几千年前。文本所携带的丰富而精确的语义信息在广泛的基于视觉的应用场景中非常重要。因此,自然场景中的文本识别一直是计算机视觉和模式识别中一个活跃的研究领域。近年来,随着深度学习的…

基础 Web 开发

1. 构建项目&#xff1a; 2.添加依赖 <dependencies> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupI…

低代码门户技术:构建高效应用的全新方式

什么是低代码门户技术&#xff1f; 低代码门户技术是一种利用低代码平台构建企业门户网站或应用的技术。门户通常是企业内部和外部用户访问信息和应用的集中平台。低代码门户技术通过图形化界面和预置组件&#xff0c;允许用户快速搭建和定制这些门户平台&#xff0c;而无需深…

数据结构入门学习(全是干货)——树(中)

数据结构入门学习&#xff08;全是干货&#xff09;——树&#xff08;中&#xff09; 1 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09; 1.1 二叉搜索树及查找 二叉搜索树&#xff08;Binary Search Tree, BST&#xff09; 是一种特殊的二叉树…

四、JVM原理-4.1、JVM介绍

4.1、JVM介绍 4.1.1、如何理解Java虚拟机&#xff0c;它的结构是如何设计的&#xff1f; 答&#xff1a; Java虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是Java语言编写的程序在运行时的执行环境。它是Java的核心组成部分&#xff0c;负责解释和执行…

开源项目 face parsing 人脸区域分割 人像区域分割 人脸分割 人像区域分割 BiSeNet

开源项目 - face parsing 人脸区域分割 人像区域分割 人脸分割 人像区域分割 BiSeNet 人像分割 开源项目地址&#xff1a;https://gitcode.net/EricLee/faceparsing 包括开源数据集 和 预训练模型 咨询合作 DataBall 项目&#xff0c;欢迎加以下微信。 助力快速掌握数据集的信…

HarmonyOS 速记

目录 装饰器Entry(入口)Component(组件)State(状态)Prop(属性)Preview(预览)PreviewerInspector 结构体structbuild自定义组件自定义 Custom 组件 容器Row(行) & Column(列)RelativeContainer(相对布局容器)marginpaddingSwiper(轮播图)Grid(网格容器)List(列表) 组件Image…

python函数一:函数的概念、函数定义与调用、函数的参数、函数的返回值、说明文档以及函数的嵌套调用

文章目录 1. 函数介绍1.1 函数的概念1.2 函数定义与调用1.2 函数的参数1.3 函数的返回值1.4 说明文档 2. 函数的嵌套调用2.1 嵌套调用及执行流程2.2 嵌套调用的应用 1. 函数介绍 1.1 函数的概念 什么是函数&#xff1f; 函数:是一个被命名的、独立的、完成特定功能的代码段&am…