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

这篇具有很好参考价值的文章主要介绍了程序的各种段以及堆栈相关问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

程序的各种段以及堆栈相关问题文章来源地址https://www.toymoban.com/news/detail-451007.html

一些问题

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

到了这里,关于程序的各种段以及堆栈相关问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 青龙面板必装依赖以及青龙各种问题

    1、一键安装所有依赖 进入青龙面板 复制下面命令执行,等待执行完毕即可!注意你的青龙目录这里的目录为ql 1.一般出现这种错误:(缺依赖) Error: Cannot find module ‘xx’ 解决方法:docker exec -it 容器名 pnpm install xx 2.一般出现这种错误:(缺文件) Error: Cannot find module ‘./xx’ 解决

    2024年02月05日
    浏览(49)
  • 通过Pycharm安装包以及Matplotlib包安装遇到的各种问题

    提示: 在系统终端中安装包(例如系统终端中通过pip安装包),在Pycharm中是不能直接使用的。因此,推荐如下两种方法安装包,尤其推荐方法2。如果没有Pycharm,Pycharm下载,选择社区版就够用了。Pycharm历史版本下载。 第一步:打开pycharm软件; 第二步:选择菜单栏File →

    2024年02月06日
    浏览(42)
  • 解决Tomcat异常:java.lang.IllegalStateException: 非法访问:此Web应用程序实例已停止。无法加载。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。

    调试项目的时候发现每次使用idea重新部署项目时会出现这个错误,但是不影响实际使用,重启服务器第一次部署时也不会出现错误,尝试搜索解决这个问题。 解决方法: 进入tomcat目录下查找配置文件,conf Context.xml,查找Context标签,修改属性reloadble为 reloadable=“false” (如果

    2024年02月04日
    浏览(43)
  • 前端系列:Centos7安装node.js以及遇到的各种问题

    自己买了一个腾讯云轻量应用服务器,第一个项目跟随github部署了一个小网站。本文记录安装node.js的过程(安装时遇到了一些坑,折腾了好久。。) 我最后安装的方法是使用源代码安装,想看这个方法的直接看最后一部分! 前期使用的方法都没有成功。 我的平台:腾讯云

    2024年02月20日
    浏览(37)
  • 下载安装各种版本的Vscode以及解决VScode官网下载慢的问题

    下载指定版本 在Vscode官网 Vscode官网更新子页 这里的左侧栏点击其中一个会跳转到某个版本,或者在官网子页 https://code.visualstudio.com/updates的后面跟上需要的版本号即可完成目标版本下载页面的跳转 选择Linux里的ARM包不会自动下载而是跳转到另一个页面 下载包的格式 URL链接

    2024年02月05日
    浏览(45)
  • STLINK下载程序出现cannot access target. shutting down debug session问题解决的一般步骤

    不要觉得只有USB接口线会出问题,排线也有可能出问题。 通过上网搜索得知,查找代码是不是使用了下载的接口 PB3和PB4 I/O口,如果使用了,初始化了的话,需要改为其他 IO 口 有时会出现Cannot Load Flash Programming Algorithm 有时会出现Could not stop Cortex-M device.Please check the JTAG cabl

    2024年02月15日
    浏览(32)
  • stm32以及freertos 堆栈解析

    以前在mcu编程的时候没有太注意堆栈的情况,只知道需要将堆栈设置的大一点。现在逐步使用freertos,在freertos中也有关于堆栈的设置,freertos的堆栈和启动文件中的堆栈关系是什么?为了以后使用的无误,本次一次性把这些弄清楚。 堆栈是一个特定的存储区或者寄存器。一般

    2023年04月08日
    浏览(36)
  • 如何在linux服务器部署pgsql,安全版以及可能出现各种问题解决(保姆级教程)

    提示:市面上那些在linux服务器部署pgsql好多都是水货,效果良莠不齐,笔者花了两天时间成功部署了pgsql,记录下方便自己以后部署,也方便其他有需要的码农 服务器环境: postgresql版本 坚决不要通过镜像下载,道路千万条,安全第一条,镜像源不一定安全,自己老老实实去

    2023年04月08日
    浏览(32)
  • python&anconda 系列:Pycharm在debug问题的N种解决方案(一般程序、web方向、人工智能方向)

    前言 Pycharm在debug时总是出现一些恼人的问题,以下是博主在训练中遇到的问题及在网上找到的可用解决方案: 一、Frames are not available 在代码处多设置几个断点即可。 好像还有另一种原因,博主自己没遇到(希望之后也别遇到),先把解决方案贴在这里(详情见 二. Pycharm在

    2024年02月01日
    浏览(35)
  • nginx处理cros跨域遇到的各种问题及解决方案,以及https配置和浏览器https不安全问题处理

    提示:本人在生产部署服务时遇到一系列跨域问题和https配置问题,特此做以下记录: 跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包