1. 程序中的栈

1.1 栈的简介

(1)栈中现代计算机程序里最为重要的概念之一

(2)栈在程序中用于维护函数调用上下文

(3)函数中的参数和局部变量存储在栈上

(4)栈保存了一个函数调用所需的维护信息

1.2 函数调用过程

(1)每次函数调用都对应着一个栈上的活动记录,调用函数的活动记录位于栈的中部,被调用函数的活动记录位于栈的顶部。

(2)函数调用栈的变化:以 int main(){f();}→f(){}为例

1.3 函数调用栈上的数据

(1)函数调用时,对应的栈空间在函数返回前是专用的

(2)函数调用结束后,栈空间将被释放,数据不再有效

指向栈数据的指针

#include <stdio.h>

int* g()
{
int a[] = { }; return a; //返回栈中的数组
} void f()
{
int i = ;
int array[] = { , , , , , , , , , }; int* pointer = g();//pointer指向g函数栈中的数组 /*
//当g函数返回后,马上将栈中的数组保存到array中
//但如果有其他函数的调用,则pointer所指向栈中的数组数据将是无效的!
for (int i = 0; i < 10;i++)
{
array[i] = pointer[i];
} for (i = 0; i < 10;i++){
printf("array[%d] = %d\n", i, array[i]);
}
*/
} int main()
{
f(); return ;
}

2. 程序中的堆

(1)堆是程序中一块预留的内存空间,可由程序自由使用

(2)堆中被程序申请使用的内存在被主动释放前将一直有效

(3)为什么有了栈还需要堆?(栈上的数据在函数返回后就会被释放掉,无法传递到函数外部,如局部数组)

(4)C 语言中通过库函数的调用获得堆空间:malloc 和 free

(5)系统对堆空间的管理方式(空闲链表法、位图法、对象池法等等)

3. 程序中的静态存储区

(1)静态存储区随着程序的运行而分配空间

(2)静态存储区的生命周期直到程序运行结束

(3)在程序的编译期静态存储区的大小就己经确定。

(4)静态存储区主要用于保存全局变量和静态局部变量

(5)静态存储区的信息最终会保存到可执行程序中

静态存储区的验证

#include <stdio.h>

int g_v = ;     //静态区
static int g_vs; //静态区,只有本文件可见 void f()
{
static int g_v1 = ; //局部静态变量——静态区
printf("g_v1 = %p\n", &g_v1);
} int main()
{
printf("g_v = %p\n", &g_v); //g_v、g_vs、g_v1三者地址比较相邻
printf("g_vs = %p\n", &g_vs); f(); return ;
}

栈区主要用于函数调用的使用,堆区主要用于内存的动态申请和归还,静态存储区用于保存全局变量和静态变量

4.程序文件的一般布局

5.程序与进程

(1)程序是静态的概念,表现形式为一个可执行文件

(2)进程是动态的概念,程序由操作系统加载运行后得到进程

(3)每个程序可以对应多个进程,但每个进程只能对应一个程序

(4)包含脚本代码的文本文件也可以看作是一个可执行程序,其对应进程的功能与脚本的内容有关。

每种脚本文件对应着一些脚解释程序,双击脚本文件,操作系统加载相应的解释程序,变成一个进程,这个进程会读取并解释执行脚本代码。

这个进程与普通进程不同,它要完成的功能并不是固定的,而是与脚本文本的内容有关。

6.文件布局在内存中的映射

(1)各个段的作用

①堆栈段在程序运行后才正式存在,是程序运行的基础

②.bss 段存放的是未初始化的全局变量和静态变量

③.text 段存放的是程序中的可执行代码

④.data 段保存的是己经初始化了的全局变量和静态变量

⑤.rodata 段存放程序中的常量值,如字符串常量

(2)程序术语的对应关系

①静态存储区通常指程序中的.bss 和.data 段

②只读存储区通常指程序中的.rodata 段

③局部变量所占空间为栈上的空间

④动态空间为堆中的空间

⑤程序可执行代码存放于.text 段

(3)同是全局变量和静态变量,为什么初始化的和未初始化的保存在不同段中?

①全局的未初始化变量存在于.bss 段中,具体体现为一个占位符(只记录变量的地址及所占大小,不会造成最终 exe 文件变大);

全局的已初始化变量存于.data 段中,记录的是变量实际占用的大小及初始化值,会造成最终 exe 变大;

②考虑到了效率问题,将未初始化的与初始化分开加载。.bss 是不占用.exe 文件空间的,只是,其内容由操作系统加载时初始化(清零)

而.data 却需要占用空间,其内容由程序初始化。

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

C语言学习笔记--内存分区的更多相关文章

  1. c语言学习笔记.内存管理.

    内存: 每个程序的内存是分区的:堆区.栈区.静态区.代码区. 1.代码区:放置所有的可执行代码,包括main函数. 2.静态区:存放所有的全局变量和静态变量. 3.栈区:栈(stack),先进后出.存 ...

  2. C语言学习笔记--内存操作常见错误

    1. 野指针 (1)指针变量中的值是非法的内存地址,进而形成野指针 (2)野指针不是 NULL 指针,是指向不可用内存地址的指针 (3)NULL 指针并无危害,很好判断,也很好调试 (4)C 语言中无 ...

  3. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  4. 《C# 语言学习笔记》——C# 简介

    1 什么是.NET Framework .NET Framework 是Microsoft为开发应用程序而创建的一个富有革命性的新平台. 1.1 .NET Framework 的内容 .NET Fra ...

  5. 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项

    博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...

  6. JVM学习笔记——内存结构篇

    JVM学习笔记--内存结构篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存结构部分 我们会分为以下几部分进行介绍: JVM整体介绍 程序计数器 虚拟机栈 本地方法栈 堆 方法 ...

  7. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  8. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  9. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

随机推荐

  1. Spring中AOP的初窥和入门小案例

    AOP:面向切面编程 AOP的主要作用:是为了程序员更好的关注"业务",专心"做事" 加上双引号的意思:所谓业务,是指他的核心,各行业中需要处理的核心事务,核心 ...

  2. OpenStack with Opendaylight Part 1: Intro to Pipeline

    Using Vagrant to create vm nodes; devstack to start openstack using Opendaylight as ML2. Openstack w ...

  3. Pycharm如何打断点

    一. python代码的调试方式 1. 使用print语句打印出来 2. 在编辑工具中,加断点跟踪(打断点) 3. 使用日志模块,输出到日志中 下面我们来看一下如何打断点 二. 环境 python 3 ...

  4. android:descendantFocusability用法简析(转)

        开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写,问题 ...

  5. ionic2——环境配置篇

    环境配置 安装nodeJS 配置cnpm 安装ionic2 安装cordova 安装java sdk 安装android sdk(在项目最后打包时app的时候会用到,前期是在浏览器环境测试开发暂时不需 ...

  6. middle school

    One of the most difficult transitions faced by parents and youth is that of going from elementary to ...

  7. hdu4771 Stealing Harry Potter's Precious(DFS,BFS)

    练习dfs和bfs的好题. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs ...

  8. 如何使用FlashFXP上传网站程序?

    查看ftp信息 [登陆,www.jinlida.cn ,单击主机管理,即可看到ftp主机地址,ftp账号和密码,注意ftp端口号] 1.请先下载并安装FlashFXP_4.1.8.1700-Speci ...

  9. 超简单tensorflow入门优化程序&&tensorboard可视化

    程序1 任务描述: x = 3.0, y = 100.0, 运算公式 x×W+b = y,求 W和b的最优解. 使用tensorflow编程实现: #-*- coding: utf-8 -*-) im ...

  10. redis有序集合的使用

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...