20深入理解C指针之---程序的栈和堆
一、程序在内存中的存储分段:

程序段主要包括:code段、data段、内核段、堆段和栈段
1、code段:
1)、存储程序汇编后程序指令
2)、此段中的数据是只读的
3)、不能用于存储变量,可以存储常量
4)、有固定的大小
2、data段包括data段和bss段:
1)、data段主要存储全局变量
2)、data段主要存储静态变量
3)、data段主要存储已初始化变量
4)、data段主要存储字符串及其他变量
5)、data段可以改写,有固定大小
6)、bss段主要存储未初始化变量
7)、bss段可以改写,有固定大小
3、内核段:
1)、一般用户不能读写
2)、处在内存地址空间的最高端
3)、涉及到地址,会出现段错误
4、堆段:
1)、人工申请分配,易出现内存泄露情况
2)、堆内存空间几乎不受任何限制,只与物理内存大小有关
3)、频繁分配与释放内存,易产生内存碎片
4)、向着内存地址增加的方向增长
5)、只能动态分配,效率较低
6)、堆中的利用的内存是不连续的内存分布
5、栈段:
1)、编译器自动分配
2)、栈空间的大小有严格要求
3)、不存在内存碎片问题
4)、向着内存地址减小的方向增长
5)、底层支持,可静态或动态分配,效率较高
6)、栈中的利用的内存是连续的内存分布
6、堆段和栈段的共同点:
1)、都不能越界访问
2)、通常说的堆栈主要指栈段
3)、手工分配内存是,堆比栈的使用更加灵活
程序使用空间的总结:
1)、自动变量存储在函数的栈帧上,在编译时完成内存分配,主要有局部变量或函数参数等
2)、静态或全局变量在程序的数据段
3)、数据段处于执行代码和系统管理的其他区域上
4)、使用函数分配时使用堆空间,堆上的空间需要手动释放
20深入理解C指针之---程序的栈和堆的更多相关文章
- 深入理解C指针----学习笔记
深入理解C指针 第1章 认识指针 理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址. 1.1 指针和内存 C程序在编译后,以三种方式使用内存: 1. 静态. ...
- 深入理解C指针之三:指针和函数
原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...
- 《深入理解C指针》
<深入理解C指针> 基本信息 原书名:Understanding and using C pointers 作者: (美)Richard Reese 译者: 陈晓亮 丛书名: 图灵程序设计 ...
- 深入理解C指针之五:指针和字符串
原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...
- 深入理解C指针之四:指针和数组
原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...
- 深入理解C指针之一:初识指针
原文:深入理解C指针之一:初识指针 简单来说,指针包含的就是内存地址.理解指针关键在于理解C的内存管理模式.C里面有三种内存: ①.静态全局内存(生命周期从程序开始到程序结束,全局变量作用域是全局,静 ...
- 深入理解C指针之二:C内存管理
原文:深入理解C指针之二:C内存管理 内存管理对所有程序来说都很重要.有时候内存由运行时系统隐式的管理,比如为变量自动分配内存.在这种情况下,变量分配在它所处的函数的栈帧上(每个函数都有它自己的栈帧, ...
- C 真正理解二级指针
本文转载自CSDN博主liaoxinmeng,做数据结构时遇到指针方面的问题,想了许久,因此我觉得很有必要复习一下二级指针及其使用 正文如下: 指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也 ...
- Linux Debugging(一): 使用反汇编理解C++程序函数调用栈
拿到CoreDump后,如果看到的地址都是????,那么基本上可以确定,程序的栈被破坏掉了.GDB也是使用函数的调用栈去还原"事故现场"的.因此理解函数调用栈,是使用GDB进行现场 ...
随机推荐
- iOS小技巧–用runtime 解决UIButton 重复点击问题
什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我们通常会在按钮点击的时候设置这个按钮不可点击. 等待0.xS的延时后 ...
- SVN:The working copy is locked due to a previous error (一)
使用 Cornerstone 时,碰到如题问题,SVN无法Update.Commit等操作. 解决办法:Working Copies ⟹ '右键' ⟹ Clean 即可解决! 尊重作者劳动成果,转载 ...
- 一句话懂什么是JS闭包
无论何时声明新函数并将其赋值给变量,都要存储函数定义和闭包.闭包包含在函数创建时作用域中的所有变量,它类似于背包.函数定义附带一个小背包,它的包中存储了函数定义创建时作用域中的所有变量. 我将永远记住 ...
- Spring源码剖析依赖注入实现
Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java 版权声明:本文为博主原 ...
- R,RJAVA 安装配置 详细版
准备工作 系统必须已经安装JDK 并配置好了环境变量. 注:安装的jdk r 以及系统 尽量保持位数一致 1.下载 R https://mirrors.tuna.tsinghua.edu.cn ...
- Yii2 HelloWord
一.安装Yii2 可以直接官网或github下载: https://github.com/yiisoft/yii2 下载完后进入项目的web/目录,入口文件为该目录下的index.php,这里直接启用 ...
- vue创建路由,axios前后台交互,element-ui配置使用,django contentType组件
vue中创建路由 每一个vue组件都有三部分组成 template:放html代码 script:放js相关 style:放css相关 vue中创建路由 1.先创建组件 Course.vue 2.ro ...
- SQL防止重复提交和Filter
/class User package com.neuedu.bean; import java.io.Serializable; public class User implements Seria ...
- 线段树:CDOJ1597-An easy problem C(区间更新的线段树)
An easy problem C Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- Latex:插入伪代码
*本文属于转载. *转载链接:https://blog.csdn.net/lwb102063/article/details/53046265 目录 clrscode algorithm algori ...