• 一直以来,我们只是单纯的去运行执行 C 程序,并没有关心这个可执行文件里面包含着什么东西。

  • 参考UNIX 环境高级编程 7.6,记录C程序的存储空间布局。



* ### C程序由 正文段,初始化数据段,非初始化数据段,栈,堆组成
* ### 正文段,初始化数据段,非初始化数据段(bss)
```
正文段:CPU执行的机器指令部分。
```
```
初始化数据段:通常将此段称为数据段,包含了程序中需明确的赋初始值的变量。
比如说,c 程序中出现在任何函数之外的声明。
静态变量都在 初始化数据段:
static int i = 1000;
全局变量
int test = 100;
```
```
非初始化数据段: 一般我们称为 bss 段,这一名称来源于早期的汇编运算符,意思是 block started by symbol , 在程序开始执行之前,kernel 会将这个 bss 段中的数据全部初始化为0或者是空指针。
比如说:
未初始化局部变量:
static int chen;
全局变量:
ing test1[100];
```
* ### 写一段简单的代码,看一下上面的内存分布, 名字是test.c:
```c
#include

void test(void)
{
printf("This is test function\n");
} int main(void)
{
printf(" This is main function\n");
return 0;
}
```c
看一下这个代码生成可执行文件的各个内存分布:
sbc_7109_454_pdk3@aplex:~/test/c_program$ gcc test.c -o test
sbc_7109_454_pdk3@aplex:~/test/c_program$ size test
text data bss dec hex filename
1229 552 8 1789 6fd test
    然后,我们在里面加一个局部变量,全局变量:
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817113549365-425031064.png)
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817113911240-769225067.png)
    在看一下局部静态变量:
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817114334756-1509640442.png)
  • 栈和堆

    在执行程序前,我们能看到的是上面的 非初始化数据段以及初始化数据段和正文段,在执行了程序后,我们还能看到栈和堆。
    栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次调用函数时,其返回地址以及调用者的环境信息,都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,可以递归调用C函数,递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。
局部变量也是存放在栈区。
    堆:动态内存分配。堆处于非初始化数据段和栈之间。
  • 代码 test.c:

    #include <stdio.h>
#include <stdlib.h>
#include <string.h> void test(void)
{
printf("This is test function\n");
} int test1 = 100;
int test2; int main(void)
{
int a;
static int b = 100;
static int c;
char *test3; test3 = (char *)malloc(sizeof(char) * 10); int *pa = &a, *pb = &b, *pc = &c, *ptest1 = &test1, *ptest2 = &test2;
printf("桟:pa = %p\n", pa); // 桟 stack
printf("堆:test3 = %p\n", test3); // 堆 heap
printf("bss: ptest2 = %p\n", ptest2); // 未初始化的数据区
printf("bss: pc = %p\n", pc); // 未初始化的数据区 bss
printf("data: ptest1 = %p\n", ptest1); // 初始化的数据区
printf("data: pb = %p\n", pb); // 初始化的数据区 free(test3); return 0;
}
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817131823225-423244804.png)
  • 空间分配如下图所示:

C 程序的存储空间记录的更多相关文章

  1. IT第二十天 - 面向对象编程思想、抽象类、异常处理、程序操作日志记录、本周总结 ★★★

    IT第二十天 上午 面向对象编程思想 1.组装电脑的设计: (1)电脑的组成:显示器+机箱 (2)机箱的组成:电源+主板+硬盘 (3)主板所包含的部件:cpu+内存+PCI接口+usb接口 (4)PC ...

  2. linux 下Qt WebEngine 程序打包简单记录

    本次记录仅作参考. 程序说明: 程序是一个编解码器控制管理的工具,使用到的库有:Qt的WebEngine.OpenGL模块.poco库.libmicrohttpd.libcurl.libvlc.同时程 ...

  3. 在程序异常中记录堆栈信息(使用ExWatcher)

    在我们编写程序的时候可通过IDE自带的调试环境捕捉到异常(Except)错误,并能查看到相关的信息以便我们修正程序中的问题.但当软件被发布出去后,因为所部署运行的环境与我们的调试环境有很大区别,即使在 ...

  4. IIS网站部署后,程序常见错误记录

    1.网站部署步骤 开启IIS服务.打开IIS管理器.添加网站.修改程序池(4.0).部署完成. 2.常见问题记录(问题记录比较模糊,仅做参考) (1).对于web.config连接数据库的配置为win ...

  5. zigw 和 nanoWatch, libudev.so 和 XMR 挖矿程序查杀记录

    最近这两天以来,服务器一致声音很响.本来以为有同事在运行大的程序,结果后来发现持续很长时间都是这样,并没有停的样子.后来查了一下,发现有几个可疑进程导致,干掉之后,果然服务器静悄悄了. 但是,问题并没 ...

  6. 转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)

    http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常 ...

  7. 利用jdk中工具完成Java程序监控方法记录

    转载加自己整理的部分内容,转载自:http://jiajun.iteye.com/blog/810150 记录下JConsole使用方法 一.JConsole是什么    从Java 5开始 引入了 ...

  8. Log4net控制台和窗体程序无法输出记录的原因之一

    在asp.net web应用程序中,读取log4net的配置文件可以这样写: [assembly:log4net.Config.XmlConfigurator(ConfigFile="Web ...

  9. 小程序踩坑记录-上传图片及canvas裁剪图片后上传至服务器

    最近在写微信小程序的上传图片功能,趟过了一些坑记录一下. 想要满足的需求是,从手机端上传图片至服务器,为了避免图片过大影响传输效率,需要把图片裁剪至适当大小后再传输 主要思路是,通过wx.choose ...

随机推荐

  1. iOS AppIcon尺寸和上传ITunes构建版本尺寸和iPhone屏幕尺寸

    避免忘记. 记录一下 App Icon: 29X2940X4058X5876X7687X8780X80120X120152X152167X167180X180 ITunes构建版本: 1242 x 2 ...

  2. HDU 2604 Queuing (矩阵乘法)

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. c# 网站生成静态页面

    在一些需要经常更新页面数据的网站中,一般访问量不是很大的都直接发布的是带后台代码,每次访问都是有数据库交互的.但是一旦访问量增加了,那么这些服务器开销变成本就要考虑进来了,像一些文章,后台编辑后,文章 ...

  4. 避免全表扫描的sql优化

    对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引:  .尝试下面的技巧以避免优化器错选了表扫描: ·   使用ANALYZE TABLE tbl_na ...

  5. .NET压缩图片保存

    需求: 需要将用户后买的图片批量下载打包压缩,并且分不同的文件夹(因:购买了多个用户的图片情况) 文章中用到了一个第三方的类库,Nuget下载 SharpZipLib 目前用的 1.1的版本 效果: ...

  6. DevExpress.XtraReports:XRPivotGrid 笔记

    1. DevExpress.XtraReports:XrPivotGrid 显示时间为"0"的 格式问题: 把xrPivotGridField1的SummaryType改为&quo ...

  7. PLSQL_统计信息系列10_统计信息过旧导致程序出现性能问题

    2014-11-15 Created By BaoXinjian

  8. PLSQL_统计信息系列04_统计信息的锁定和删除

    20150506 Created By BaoXinjian

  9. openssl之EVP系列之9---EVP_Digest系列函数的一个样例

    openssl之EVP系列之9---EVP_Digest系列函数的一个样例     ---依据openssl doc/crypto/EVP_DigestInit.pod翻译     (作者:Drago ...

  10. controller与requestmapping

    使用@controller定义controllersSpring mvc将特定url的请求分发到controller类来进行处理在spring 3.0中,通过@controller标注即可将class ...