C语言探秘:C代码在内存中的分布

估计会有很多初学者跟我有一样的疑惑,这些编写好的代码是放在磁盘中,但是运行将会被copy至内存中去运行。但他们在内存中是怎么分布呢。在 “linux下c编程圣经”(apue)UNIX环境高级编程一书中阐述了这一点。在这里结合网上资料以及这本书写下自己的一点学习笔记。

在内存中程序分别存储在如下几个区域中:

一、正文区(Code or Text)

对于名字有很多,有的称为代码段,代码区等等。但是实质都是一样的,都是用来存放程序语句进行编译后,形成机器的代码。一般此内存区是只读的,防止程序意外修改指令。

二、初始数据段(RO/RW data segment)

通常是用来存放程序中已初始化的全局变量的一块内存区域。又分为只读和读写两种,此数据段属于静态内存分配

三、未初始化数据段(BSS = Block Started by Symbol)

未初始化读写据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间.BSS段也属于静态内存分配

四、堆(heap)

堆内存只在程序运行时出现,一般由程序员手动分配和释放,一般可以使用malloc()/nalloc() & free() 函数来申请、释放。在操作系统下,如果程序员没释放,一般操作系统可以在程序结束后回收内存

五、栈(stack)

存放程序的局部变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。由于栈的最大特点进先出,所以栈特别方便用来保存/恢复调用现场。

用图片来解释会更加通俗。左图是书上的。从图上可以看到,栈(stack)是自顶向下生长的,即由高地址向低地址;堆(heap)是自底向上生长。右图是栈的进出示意图,很明显的后进先出。

   

这里比较重要的概念主要是 栈 和 堆。在网上收集了下他们之间的 PK “数据”

栈   


栈内存从高地址向低地址分配


堆内存将从低地址向高地址分配


栈使用
线性存储的方式


堆使用
链表来实现


栈是
连续内存分布的方式


堆是
非连续内存分布方式

栈只有一个入口,就是栈指针,栈指针标识当前栈区域中已经使用与未使用的界限,程序访问栈内存的时候都只能通过栈指针及其偏移量


    堆内存有多个入口,每次分配得到的指针是访问内存的入口,每个分配内存都可被单独释放



    栈内存在分配的时候,不能在程序中判断其成功与否,当栈内存的使用量比较大的时候(例如使用函数进行递归运算),栈内存可能超出系统的容量,这时程序运行将发生栈溢出错误

    堆内存在分配的时候,可以在程序中判断malloc()等函数的返回值是否为NULL来确定对内存是否分配成功,是否可以使用


栈内存由编译器管理,不需要程序来管理,同时,函数内部的栈内存是不能被函数的调用者使用的


堆内存需要在程序中处理它的分配与释放情况(由程序调用具体的库函数管理),可以利用灵活的程序将堆内存的指针从函数的内部传递到函数的外部,这时各个函数都可以使用别的函数分配出来的堆内存。


栈的一些特殊定义:

栈限定只能在表的一端进行插入和删除操作的线性表。允许插入和删除的一端称作栈顶(top),不允许插入和删除端称作栈底(bottom)
空栈:这里有两种说法。1.堆栈指针指向下一个将要放入数据的空位置时。
                      2.
栈顶指向栈底地址时,即栈内没有数据时为空栈。
  (
对于上面这两种定义一直没有找到权威的出处。网上两种概念都存在,我也不知道哪种才是正确的,希望有明确此概念的大神提点下。
满栈:栈指针指向的是一个有可用数据的,也就是最后一个使用的空间。
有图才有真相,没图没人理.上图咯。

上面把空栈的两种定义都画出来了,可能有一个是有误的,等我找到权威定义后更新此文,把错误的说法列成反面例子,供大家“批斗”!

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

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

相关文章

集合:按元素的中文属性排序

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 要排序的元素类&#xff1a; public static class NameCount implements Comparable<NameCount> {Collator collator Collato…

kibana 安装

附另 2 文章&#xff1a; elasticsearch-head 安装 elasticsearch 安装( 阿里云ECS )、远程访问、启动报错处理 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我的 elasticsearch 是…

linux jps 命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 jps -- Java Virtual Machine Process Status Tool 可以列出本机所有java进程的pid jps [ options ] [ hostid ] 选项 -q 仅输出…

“4K”时代将来临!标准/技术一网打尽

第1页&#xff1a;4K 分辨率与 DCI 数字电影院在今年的 CES&#xff08;电子消费大展&#xff09;上&#xff0c;除了让人眼花缭乱新手机等移动设备外&#xff0c;还有一个领域让人感到相当瞩目&#xff0c;这就是所谓的 4K 电视产品。 4K 电视的卖点当然是高分辨率&#xff0c…

解决:Error while compiling statement: FAILED: SemanticException [Error 10007]: Ambiguous column refere

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.报错&#xff1a; Error while compiling statement: FAILED: SemanticException [Error 10007]: Ambiguous column reference creat…

解决:which: no java in (/root/chengxu/maven/apache-maven-3.5.2/bin:/usr/local/sbin:/usr/local/bin:/usr

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错&#xff1a; which: no java in (/root/chengxu/maven/apache-maven-3.5.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/…

Image Processing Wavefronts for HEVC Parallelism

Unlike H.264/AVC, where parallelism was an afterthought, the current HEVC draft contains several proposals aiming at making the codec better “parallelizable”. H.264/AVC supports slices, which were introduced mainly to prevent loss of quality in the case …

Hive 删除整个数据库,包括其中的所有表

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 drop DATABASE IF EXISTS 数据库名 CASCADE; 使用CASCADE &#xff0c;表示强制删除。

Windows 9信息曝光:统一开发接口、整合Cortana到任务栏

摘要&#xff1a;2014年微软全球合作伙伴大会在美国华盛顿正式拉开序幕&#xff0c;会上&#xff0c;微软首席运营商Kevin Turner透露了微软下一代操作系统Windows 9的一些信息&#xff1a;统一开发接口、语音助手Cortana将被整合到任务栏、桌面小工具回归等。 北京时间7月15日…

解决: Error while compiling statement: FAILED: ParseException line 23:13 extraneous input ‘(‘ expectin

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. hive 执行sql&#xff0c;报错&#xff1a; Error while compiling statement: FAILED: ParseException line 23:13 extraneous inp…

程序员可以只关心技术么?

摘要&#xff1a;不少程序员爱维护喜欢的技术&#xff0c;虽然他们说的有道理&#xff0c;但程序员价值的实现并不取决于技术。模式不一样&#xff0c;程序员价值也不一样&#xff0c;而这也暗含了程序员生涯的两个进阶模式&#xff0c;读完此文&#xff0c;相信你会重新思考个…

Intellij IDEA中分屏显示方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 今天才发现IDEA中还有split view的功能&#xff0c;上网查的时候查到了很多莫名其妙的东西。 实际上对想分屏显示的文件 右键->Spli…

IDR、CRA、BLA、RASL、RADL、closed-gop、open-gop

相对于H.264编码的每个GOP是相互独立的&#xff0c;GOP切换用I帧&#xff0c;帧间搜索不再参考前一个GOP。而HEVC切换则可以“软切换”。 BLA、CRA、IDR是文献中提到过的三种随机接入点(RAP)&#xff0c;在文献中的解释的确不是很容易理解。 &#xff08;1&#xff09;关于GOP…

ROW_NUMBER() OVER() 函数用法详解 (分组排序,多例子)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 语法格式&#xff1a;row_number() over(partition by 分组列 order by 排序列 desc) row_number() over()分组排序功能&#xff1a; …

解决:您需要来自xxx的权限才能对此文件夹进行更改(电脑系统取得管理员权限)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.莫名的一个项目工程代码就打不开了。提示信息为&#xff1a; 2. 删除也不行&#xff0c;更新也不行&#xff0c;火大&#xff0c;我惹…

程序员父亲的遗产——编程十诫

我的父亲在和我彻谈编程两个星期之后就去世了。 那个时候我22岁&#xff0c;一个刚刚完成美学学士毕业设计的大四学生。而我的父亲62岁&#xff0c;比大多数我同龄人的父亲都要老。早在60年代&#xff0c;他就已经在田纳西理工大学开始编程了&#xff0c;那个时候他在穿孔卡片…

解决:Can not deserialize instance of com.xxx.xx.XXModel out of START_ARRAY toke

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. json数据解析报错&#xff1a; Can not deserialize instance of com.xxx.xxx.model.XXXModel out of START_ARRAY token 2. 需要一…

HEVC标准概览

HEVC标准概览HEVC&#xff08;高效视频编码标准&#xff09;是ITU-T VCEG&#xff08;国际电联电信标准化部视频编码组&#xff09;与ISO/IEC MPEG&#xff08;国际标准化组织国际电工委员会视频标准化组&#xff09;的合作组织JCT-VC最新项目。ITU-T和ISO/IEC计划在2013年1月共…

解决:Unable to identify index name. XXXModel is not a Document. Make sure the document class is annota

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 往 elasticsearch 写入数据调用 index 方法&#xff0c;执行报错&#xff1a; Unable to identify index name. XXXModel is not a …

为什么年事已高的我还在编程?

每一个行业的从业人员都会有变老的那一刻&#xff0c;难道变老了之后还要继续从事之前的工作吗&#xff1f;估计没人愿意&#xff0c;除非是体力上吃得消的。接下来所讲述的就是作为程序员的码农们该如何迎接慢慢变老之后的工作转变&#xff01;人们都会期望随着岁数的增加&…