C程序-进程内存结构分析
1. 每个进程都运行在自己私有的内存空间中(即虚拟地址空间)。在32位系统中,4GB的进程地址东健被分为用户空间和内核空间两个部分。用户空间占据着0~3GB(用16进制表示为0xC0000000),而内核空间的范围是3GB~4GB。对于一个进程而言,都会涉及3种不同的数据段,分别是代码段、数据段和堆栈段。
代码段:用于保存可执行文件的操作指令和程序定义的常量。为了防止代码在运行的时候被其他进程修改,代码段将只允许读取,不能进行修改。多进程能够共享相同的代码段,即当程序被多次执行时,运行的相同程序将共享代码段。
数据段:其位置紧接着代码段,分为初始化数据段和未初始化数据段(也称为BSS段)。初始化代码段用于存放已经初始化的全局变量和程序的静态变量,而未初始化数据段用于保存未初始化的全局变量。
堆栈段:堆栈段的堆用于存放进程中动态分配的内存地址。例如,在C语言中使用malloc函数、在C++中使用new函数分配的内存空间都将在堆中分配。当使用free函数或delete函数释放内存时,分配的内存将从堆中删除。栈用于保存程序中创建的临时变量。函数调用时,传递的参数也将被保存在栈中。在函数调用结束后,其返回值也将保存在栈中。栈具有先进先出的特点,适用于保存和恢复现场。可以将栈看作用于存放临时数据、进行数据交换的内存区域。栈的大小受操作系统的限制,因此从栈中获得的空间大小有限,而堆的大小只是受限于虚拟内存空间,因此使用堆可以获得较大的内存空间。堆的位置与数据段相邻。
2. 代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int etext,edata,end;// //g_pstr和g_buffer都为全局变量,只是一个初始化,一个未初始化
char *g_pstr="Global string\n";
char g_buffer[]; inline void disp_addr(char * p,int addr)
{
printf("Name :%s Address :%0x\n",p,addr);
} void disp_var(char* p)
{
char *buffer1;
disp_addr("buffer1 address:",(int)(&buffer1));
buffer1=(char*)malloc(strlen(p)+);
strcpy(buffer1,p);
printf("buffer1 : %s\n",buffer1);
free(buffer1);
} int main()
{
int i=; //以十六进制显示
printf("Addr etext :%p\n",&etext);
printf("Addr edata :%p\n",&edata);
printf("Addr end :%p\n",&end); //显示各个函数和变量地址
disp_addr(" function main() :",(int)(main));
disp_addr("function disp_var():",(int)(disp_var));
disp_addr(" g_pstr address :",(int)(&g_pstr));
disp_addr(" g_buffer address :",(int)(&g_buffer));
disp_addr(" i address :",(int)(&i)); disp_var(g_pstr);
return ;
}
3. 运行结果
Addr etext :0x8049954
Addr edata :0x8049958
Addr end :0x8049950
Name : function main() :,Address :804850c
Name :function disp_var():,Address :80484a7
Name : g_pstr address :,Address :
Name : g_buffer address :,Address :804993c
Name : i address :,Address :bf8583ec
Name :buffer1 address:,Address :bf8583bc
buffer1 : Global string
4. 图示
5.用户空间到0xC0000000-0xBFB18CAC = 栈的大小
在VC或VS中好像是使用 #pragma comment(linker, "/STACK:1024000000,1024000000")
至于linux 下就不太清楚了
出处:http://www.cnblogs.com/wunaozai/p/3636771.html
C程序-进程内存结构分析的更多相关文章
- Linux系统下输出某进程内存占用信息的c程序实现
在实际工作中有时需要程序打印出某个进程的内存占用情况以作参考, 下面介绍一种通过Linux下的伪文件系统/proc 计算某进程内存占用的程序实现方法. 首先, 为什么会有所谓的 伪文件 呢. Linu ...
- 如何优化cocos2d程序的内存使用和程序大小
在我完成第一个游戏项目的时候,我深切地意识到"使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰".而我刚开始接触cocos2d的时候,社区里面的人 ...
- 如何优化cocos2d程序的内存使用和程序大小:第一部分
译者: 在我完成第一个游戏项目的时候,我深切地意识到“使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰”.而我刚开始接触cocos2d的时候,社区里面的人们讨论了一个 ...
- java\c程序的内存分配
JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该 ...
- Linux C进程内存布局
当程序文件运行为进程时,进程在内存中获得空间.这个空间是进程自己的内存空间.每个进程空间按照如下方式分为不同区域: 进程内存空间布局图 text:代码段.存放的是程序的全部代码(指令),来源于二进制可 ...
- 程序的内存分配 C\C++
原文:http://blog.csdn.net/oohaha_123/article/details/24460425 程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区( ...
- Linux C 程序 进程控制(17)
进程控制 1.进程概述现代操作系统的特点在于程序的并行执行.Linux是一个多用户多任务的操作系统.ps .pstree 查看进程进程除了进程id外还有一些其他标识信息,可以通过相应的函数获得.// ...
- C程序的内存分配
一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. ...
- 如何优化cocos2d程序的内存使用和程序大小:第一部分_(转)
译者: 在我完成第一个游戏项目的时候,我深切地意识到“使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰”.而我刚开始接触cocos2d的时候,社区里面的人们讨论了一个 ...
随机推荐
- SqlServer 之 系统视图
一.了解系统视图 1. 系统视图:从名字上看就知道,就是存放一些sqlserver系统的一些信息. 2. 存在位置: 下面截图看看,从截图中你可以看到,不管是“系统数据库”还是“用户数据库”都是有这些 ...
- C# WebRequest处理Https请求
http://www.cnblogs.com/youlechang123/archive/2013/03/23/2976630.html 正常情况下,处理https和http没有什么区别,如以下代码, ...
- 算法笔记_206:第五届蓝桥杯软件类决赛真题(Java语言A组)
目录 1 海盗分金币 2 六角幻方 3 格子放鸡蛋 4 排列序数 5 幂一矩阵 6 供水设施 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 海盗分金币 有5个海盗,相约进行一次帆船比赛. 比 ...
- EXCEPTION-El表达式
CreateTime-- Author:Marydon 声明:异常类文章主要是记录了我遇到的异常信息及解决方案,解决方案大部分都是百度解决的,(这里只是针对我遇到的做个汇总),特此声明! stud ...
- eclipse 修改maven项目的jdk版本
eclipse 修改maven项目的jdk版本 CreationTime--2018年6月8日10点29分 Author:Marydon 1.情景展示 jdk版本太低,如何修改 2.错误方式 第一 ...
- 【FinacialKnowledge】财务报表及名词解释
1.财务报表 以下三张表为:资产负债表.利润表.现金流量表 ...
- 一个简单的knockout.js 和easyui的绑定
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Basi ...
- 递归和for循环
# -*- coding: utf-8 -*- #python 27 #xiaodeng #http://www.cnblogs.com/BeginMan/p/3223356.html #递归2 '非 ...
- 腾讯云-Linux 基础入门
Linux 基础入门 目录操作 任务时间:5min ~ 10min 创建目录 使用 mkdir 命令创建目录 mkdir $HOME/testFolder # $HOME 当前用户的家目录 root ...
- highstock K线图 深入研究
K线图,相信每个股民都不陌生,如何用SVG画好一个K线图是一个难题. 我选择用highstock做为画图组件,适当的修改了一下源码,参考了数个财经网站的案例,完成了一个不太成熟的K线图,欢迎大家批评指 ...