一、程序在内存中的存储分段:

    程序段主要包括: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指针之---程序的栈和堆的更多相关文章

  1. 深入理解C指针----学习笔记

      深入理解C指针     第1章 认识指针   理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址.     1.1 指针和内存   C程序在编译后,以三种方式使用内存: 1. 静态. ...

  2. 深入理解C指针之三:指针和函数

    原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...

  3. 《深入理解C指针》

    <深入理解C指针> 基本信息 原书名:Understanding and using C pointers 作者: (美)Richard Reese 译者: 陈晓亮 丛书名: 图灵程序设计 ...

  4. 深入理解C指针之五:指针和字符串

    原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...

  5. 深入理解C指针之四:指针和数组

    原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...

  6. 深入理解C指针之一:初识指针

    原文:深入理解C指针之一:初识指针 简单来说,指针包含的就是内存地址.理解指针关键在于理解C的内存管理模式.C里面有三种内存: ①.静态全局内存(生命周期从程序开始到程序结束,全局变量作用域是全局,静 ...

  7. 深入理解C指针之二:C内存管理

    原文:深入理解C指针之二:C内存管理 内存管理对所有程序来说都很重要.有时候内存由运行时系统隐式的管理,比如为变量自动分配内存.在这种情况下,变量分配在它所处的函数的栈帧上(每个函数都有它自己的栈帧, ...

  8. C 真正理解二级指针

    本文转载自CSDN博主liaoxinmeng,做数据结构时遇到指针方面的问题,想了许久,因此我觉得很有必要复习一下二级指针及其使用 正文如下: 指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也 ...

  9. Linux Debugging(一): 使用反汇编理解C++程序函数调用栈

    拿到CoreDump后,如果看到的地址都是????,那么基本上可以确定,程序的栈被破坏掉了.GDB也是使用函数的调用栈去还原"事故现场"的.因此理解函数调用栈,是使用GDB进行现场 ...

随机推荐

  1. 08GNU as汇编

    1. 概述 ​ 由于操作系统许多关键代码要求有很高的执行速度和效率,因此在一个操作系统源代码中通常就会包含大约 10% 左右的起关键作用的汇编语言程序量.Linux 操作系统也不例外,它的 32 位初 ...

  2. Eclipse使用Mybatis-Generator插件

    Mybatis-Generator插件极大地方便了我们的开发效率,不用每张表每个字段人工去敲,所以本文介绍使用Mybatis-Generator自动生成Dao.Model.Mapping相关文件 版权 ...

  3. OwinStartupAttribute出错

    尝试加载应用时出现了以下错误.- 找不到包含 OwinStartupAttribute 的程序集.- 找不到包含 Startup 或 [AssemblyName].Startup 类的程序集.若要禁用 ...

  4. Goroutines和Channels

    原文链接 https://golangbot.com/goroutines/ Goroutines Goroutines 可以被认为是多个函数或方法同时允许.可以认为是一个轻量级的线程.与线程的花费相 ...

  5. 水题:51Nod1095-Anigram单词

    1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 Description 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那 ...

  6. 彻底卸载gedit

    $ sudo  apt-get  purge gedit gedit-plugins$ sudo apt-get autoremove

  7. [转] NGINX宏观手记

    前言 任何一个工具都有它的灵魂所在,作为一个PHP程序员,我们可能仅仅使用了它的一小部分,这篇文章让你更加了解Nginx,本章大多都是总结.翻译.整理 ,希望你可以知道nginx不仅仅是PHP的附属品 ...

  8. UTV - URL Tag Validation

    What`s UTV 1.URL Tag Validation 2.Special format of URL for preventing unauthorized usage and access ...

  9. Oracle 了解 DDL 操作与 REDO 的关系

    目录 了解 DDL 操作与 REDO 的关系 DDL是否会产生REDO 通过 10046 trace 来分析create 和drop 如果drop失败,redo的变化 了解 DDL 操作与 REDO ...

  10. 以http server为例简要分析netty3实现

    概要 最近看了点netty3实现.从webbit项目作为口子.webbit项目是一个基于netty3做的http与websocket server.后面还会继续看下netty4,netty4有很多改进 ...