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,一经查实,立即删除!

相关文章

kibana 安装

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

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

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

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 …

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

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

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

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

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

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

Intellij IDEA中分屏显示方法

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

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

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

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

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

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

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

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

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

解决: Intellij IDEA 运行报错 Command line is too long

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. idea启动工程报错: 2. 网上找到2个方法。方法一我试了有效果。方法二我同事试了有效果。 方法一: 修改项目…

年薪50万码农转行卖凉皮,互联网思维又一次颠覆?

摘要:今年五月份,一位年薪50万元的码农哥放弃了码农的工作,转身跳到了苦脏累的餐饮行业,每天骑着筋斗云电动车在中关村送外卖的事迹在互联网上引起了轰动。近日,码农哥接受了CSDN的采访,让我们一窥其转行背…

hue 查询 hbase 操作相关参考

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 界面操作说明 进入hue中的hbase 进入表的查询界面 界面说明 查询语句 ,表示结束查询,可以不加 主键查询 输入主键 rowke…

.NET技术+25台服务器怎样支撑世界第54大网站

摘要:同时使用Linux和Windows平台产品,大量使用静态的方法和类,Stack Overflow是个重度性能控。同时,取代横向扩展,他们坚持着纵向扩展思路,因为“硬件永远比程序员便宜”。 【编者按】StackOverflow是一个…

apache sgoop 导入数据到 oracle、导出数据到 oracle 实现

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 业务场景:是在oracle 数据库和 hive 数据库中 ,有多个相同结构的表,要求数据从2个库定时双向同步。…

最佳的开源云项目有哪些?

Linux.com和The New Stack联合起来做了一个调查:你认为的最受欢迎的开源云项目是哪些?调查涵盖了hypervisors、IaaS、PaaS、管理和服务开通和其它类别的开源项目。所有项目较为成熟的、有规模的开源云项目。下一代的企业正在使用开放云技术打造完全不同的…

解决:-source 1.6 中不支持 diamond 运算符 [ERROR] (请使用 -source 7 或更高版本以启用 diamond 运算符)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 工程打包 mvn clean install 执行报错&#xff1a; 2. 解决方法&#xff0c;在pom中加上如下配置&#xff1a; <plugin><gr…

是什么摧毁了程序员的工作效率

本文是html5tricks原创翻译&#xff0c;转载请看清文末的转载要求&#xff0c;谢谢合作&#xff01; 下图是摘自网上有关程序员工作效率的论述。 正如Homer Simpson所说&#xff0c;如果这是真的&#xff0c;那就有意思了。 我之所以不能一针见血地发现如何才能高效工作的秘密…

解决:single failed: For artifact {null:null:null:jar}: The groupId cannot be empty. 把工程依赖的jar包打到入jar中

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 执行 mvn clean install 报错&#xff1a; Execution make-assembly of goal org.apache.maven.plugins:maven-assembly-plugin:2.4…