程序的各种段以及堆栈相关问题

news2024/10/2 16:22:01

C中一般有三种变量:

  1. 局部变量
  2. 全局变量
  3. 静态变量

C中一般有五个内存段:

  1. 代码段
    • 也叫文本段,包含frequently executed code
    • 通常是只读的(未了避免程序被错误改写)
    • 代码段是不包含程序变量(如局部变量、全局变量)的
    • 代码段可以包含只读的string字符,如包含代码printf("Hello World")时,"Hello World"会被创建在代码段中

数据段:会再被分为未经初始化的和已初始化的数据段。通常位于堆的下面或栈的上面

  • Global variables are stored in the data section. Unlike the stack, the data region does not grow or shrink – storage space for globals persists for the entire run of the program
  1. 未经初始化的数据段:
    • 称为 bss
    • bss包含:
      • 未初始化的全局变量(包括指针变量)
      • 未初始化的局部静态变量
    • 若声明了一个全局变量并初始化为0或NULL,仍会存在bss中
  2. 初始化的数据段:这段的大小由程序源代码中的变量值大小决定,并且在运行过程中不会改变
  3. 栈段:
    • 用于存储函数(可以是main函数或用户定义的函数)内部创建的变量。在函数执行结束后存放在栈中的这些变量会被移除
      • 函数的局部变量
      • 传递到函数的参数
      • 返回地址
    • The amount of stack space grows and shrinks over the program’s execution as functions are called and returned from. So the stack part of memory is typically allocated near the bottom of memory to leave space for it to change
  4. 堆段:
    • 用于支持动态内存分配(如malloc calloc realloc
    • 例如,当执行int* prt = malloc(sizeof(int) * 2时会在堆中分配8字节的内存空间,且这一空间的内存地址会被返回并存储到ptr变量中。ptr变量要么在栈中,要么在数据段中(取决于ptr是怎么被声明的)
    • The heap is typically located far from stack memory, and grows into higher addresses as more space is dynamically allocated by the running program

请添加图片描述

一些问题

  1. 数据段和数据栈、数据堆都是存放变量的,有什么区别:
    数据段只包含全局或静态变量,这些变量都有预定义的值,是在程序运行前就初始化好了的
    数据堆包含动态分配的数据,并且这一部分的开头一般是数据段的结尾
    数据堆、数据栈的
  2. 堆和栈是什么,有什么区别:
    栈:调用函数时,会在栈顶保留一个块用于该函数的局部变量等。当函数返回时,该块变为未使用状态,可在下次调用函数时使用。从堆栈中释放一个块就是调整栈顶指针。
    堆:堆不像栈那样,分配和释放都是遵循一个固定模式的(先来后释放),所以对于追踪堆的那个部分在何时被分配或被释放更加复杂。
    操作系统为每一个系统级线程分配一个栈,当线程退出时栈也被回收。堆是分配给进程的。
    栈更快,因为其先进后出的模式使得当分配或释放空间时,只需要改变栈顶指针即可;而堆就慢了。且栈通常被访问的非常频繁,因此会被map到cache当中,因此会非常快。
    堆大部分存的都是全局资源,因此必须要multi-threading safe。具体来说就是每一次分配和释放需要同步

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

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

相关文章

【数据结构】带头双向链表,真正的六边形战士

文章目录 概要整体架构流程小结 概要 *数据结构中的链表在实际开发中应用非常广泛,但写一个链表并不是一件简单的事情。链表有八种结构,对于刚入门的新手来说,往往会先经历单链表的折磨。 而今天我要讲的带头双向链表非常适合新手学习&#…

C++6.类和对象(下)

1.友元函数,一般现在类的最上面。 2.函数的参数中,如果不改变,尽量加上const修饰。 3.对于自定义类型,使用运算符进行操作基本上都要用运算符重载,但是有些运算符重载会默认自动生成。 4.初始化列表,是成…

【wpf】列表类,用相对源时,如何绑定到子项

前言 在之前的一篇文章 :《【wpf】深度解析,Binding是如何寻找数据源的》https://blog.csdn.net/songhuangong123/article/details/126195727#:~:text%E3%80%90wpf%E3%80%91%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%EF%BC%8CBinding%E6%98%AF%E5%A6%82%E4…

读书|林曦:她把自己的生活,过成了无用但丰盈的美学

时代在以加速度的方式变化,让人难以从容。而当我们陷于横向的比较系统,权衡着卷、躺、润时,也有人在探寻另一条纵向的路——向古人学习,以传统美学关照和滋养当下生活。      立夏之际,水墨画家林曦的新作《无用之…

33岁跳槽无路,濒临绝望之际受贵人指点,成功上岸阿里(测试岗)

写在前面 马上过34岁生日了,和大家聊聊最近的情况,半年前还在迷茫该学什么,怎样才能走出现在的困境,半年后已经成功上岸阿里,感谢在这期间帮助我的每一个人 开始 30多岁工作的时候总是有种力不从心的感觉&#xff0…

网络安全工程师需要考什么证吗?

目前网络安全行业,国内都有哪些证书可以考。 一、CISP-PTE (国家注册渗透测试工程师) CISP-PTE即注册信息安全渗透测试工程师,该证书由中国信息安全测评中心颁发,证书是国内唯一认可的渗透测试认证,专业性…

AIOps社区低代码项目火热报名中|中科院开源之夏2023,万元现金等你来拿!

活动介绍 开源之夏是由中科院软件所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动,旨在鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者,促进优秀开源软件社区的蓬勃发展,助力开源软件供应链…

告别Excel,免费大数据分析与可视化工具,让你的论文图表“高大上”

数据分析工具很多,可以分为表格、数据库、BI工具、编程等四大工具。每个大类又有很多的工具,例如表格包括Excel、WPS、Google Sheets、Airtable等。编程工具包括Python和R。 搞科研几年了,笔者一直都是在使用Excel做数据分析和可视化&#xf…

Go语言中sync.Map、sync.Pool和Context的用法

目录 【sync.Map】 实现线程安全的 map 类型 使用 sync.Map 实现并发读写的map 【sync.Pool】 使用 带缓冲channel 实现对象池 使用 sync.Pool 创建临时对象池 【Context 上下文】 Context应用:实现带超时功能的远程调用 Context应用:监控指令…

电脑找不到MSVCR120.dll怎么办/MSVCR120.dll是什么?

电脑提示找不到MSVCR120.dll怎么办?你是否也遇到这个问题,MSVCR120.dll是什么文件呢?小编今天就把MSVCR120.dll文件丢失的修复方法给大家。msvcr120.dll是Microsoft Visual C 的一部分,它是Windows操作系统中的一个动态链接库文件…

计算卸载-论文05-双层优化(无线充电与卸载)

标题:《A Divide-and-Conquer Bilevel Optimization Algorithm for Jointly Pricing Computing Resources and Energy in Wireless Powered MEC》 期刊:IEEE TRANSACTIONS ON CYBERNETICS,2022 一、理论梳理 问题:相比于移动云…

基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用

植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于…

基于MAX-10 FPGA 读取超声波模块HC_SR04距离数据到数码管上

目录 实验现象简单介绍超声波测距模块HC_SR04模块框图模块编写测距信号源距离计算数码管模块顶层模块 总结 实验现象 将MAX-10小脚丫FPGA和超声波模块HC_SR04插在面包板上,用杜邦线将对应的引脚连接好,烧录程序,小脚丫自带的数码管显示距离数…

全网火爆,性能测试面试常问+测试小技巧总结,要卷就卷成最强的...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试面试常问…

itop-3568开发板驱动学习笔记(26)设备树(五)中断实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 中断控制器配置中断其他属性 中断控制器 设备树中的中断控制器节点和 GPIO 控制器类似,都是由芯片厂家编写,如果是外部中断,中断控制器和 GPIO 控制器是共存的&#xff…

TDengine “亮相” ODSC East,开发者争相驻足交流

最近 TDengine 终于将时序数据技术创新这把火 烧到了美国波士顿 并获得了一众国外开发者的热捧 而这一次 TDengine 的成功落地 还得从两天前的一场数据大会说起... 波士顿当地时间 5 月 9 日,一场名为 ODSC East 的数据技术盛会在波士顿缓缓拉开序幕&#xff0…

YOLO V1-V3 简单介绍

目录 1. YOLO 2. YOLO V1 3. YOLO V2 4. YOLO V3 5. YOLO V3 SPP网络 5.1 Mosaic 图像增强 5.2 SPP 模块 5.3 CIou Loss 5.4 Focal loss 1. YOLO YOLO 是目标检测任务强大的算法,将目标检测的问题转换边界框和相关概率的回归问题,是目标检测…

【JAVA应届生如何提高职场竞争力】从蓝海走向红海的IT世界,新人如何掌握IT技能和找到合适的工作

从蓝海走向红海的IT世界,新人如何掌握IT技能和找到合适的工作。 在当前就业形势下,如何提高应届生在职场中的竞争力?具有哪些有效的方法和策略可供选择?这是一个备受关注的热点话题。哪些方面会对应届生的职场发展起到关键的推动和支撑作用呢? 前段时间有位CSDN的…

更高效便捷的开发体验——Cloud Studio 编辑器命令行工具

Cloud Studio 是一个云端在线开发平台,在 Cloud Studio 的控制台页面中,可以方便快捷创建或者打开一个工作空间。工作空间提供了在线编辑器给大家访问远端开发环境。大部分开发时间都与这个在线编辑器打交道,在线编辑器效果如下图所示&#x…

【刷题之路】LeetCode232——用栈实现队列

一、题目描述 原题链接:https://leetcode.cn/problems/implement-queue-using-stacks/ 题目描述: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类…