四川电脑网站建设,网站建设管理工作总结,去哪个网站找建筑图纸,怎么建立以太网估计会有很多初学者跟我有一样的疑惑#xff0c;这些编写好的代码是放在磁盘中#xff0c;但是运行将会被copy至内存中去运行。但他们在内存中是怎么分布呢。在 “linux下c编程圣经”#xff08;apue#xff09;UNIX环境高级编程一书中阐述了这一点。在这里结合网上资料以及…估计会有很多初学者跟我有一样的疑惑这些编写好的代码是放在磁盘中但是运行将会被copy至内存中去运行。但他们在内存中是怎么分布呢。在 “linux下c编程圣经”apueUNIX环境高级编程一书中阐述了这一点。在这里结合网上资料以及这本书写下自己的一点学习笔记。 在内存中程序分别存储在如下几个区域中
一、正文区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.栈顶指向栈底地址时即栈内没有数据时为空栈。 对于上面这两种定义一直没有找到权威的出处。网上两种概念都存在我也不知道哪种才是正确的希望有明确此概念的大神提点下。 满栈栈指针指向的是一个有可用数据的也就是最后一个使用的空间。 有图才有真相没图没人理.上图咯。 上面把空栈的两种定义都画出来了可能有一个是有误的等我找到权威定义后更新此文把错误的说法列成反面例子供大家“批斗”