C/C++编译的程序占用的内存

/***********************************************************
 *                                                         *
 *                 C程序内存布局                           *
 *                                                         *
 ***********************************************************
 *(高地址空间)
 *   ---------------------------------
 *   -     命令行参数区              -     (命令行参数和环境变量)
 *   ---------------------------------
 *   -  堆区(Stack Area)           -     局部变量
 *   -  栈区(Heap Area)            -     malloc动态分配数据
 *   ---------------------------------
 *   - 数据区(Data Area)分为:      -
 *   - 未初始化静态变量区(.bss)    -    没有初始化的全局变量和静态变量
 *   - 已初始化静态变量区(.data)   -    初始化的全局变量和静态变量
 *   - 文字常量区(.rodata)         -    常量字符串
 *   ---------------------------------
 *   - 代码区(Code)                  -    二进制的代码
 *   ---------------------------------
 *(低地址空间)
 *Code,.rodata,.data在链接之后产生
 *.bss在程序初始化的时候开辟
 *stack,heap在程序运行中开辟和释放
 *栈区:操作方式类似于数据结构中的栈,向地地址空间扩展
 */ 

#include<stdio.h>
#include<stdlib.h>
#include <string.h>

int g_var1;  //BSS
int g_var2 = 10;  //DATA

int  main(int argc, int *argv[])
{//ARGC:STACK  ARGV:STACK  *ARGV:COMMAMD
    char arr[] = "hello";  //STACK
    char *ptr1 = "hello,world";  // PTR1:STACK, ptr1->RO_DATA, "hello,world":RO_DATA
    char *ptr2 = NULL;     //PTR2:STACK
    int i = 0;

    static int s_var3;     //BSS
    static int s_var4 = 100;  //DATA

    const int var = 10;  //VAR:STACK

    printf("COMMAND:*argv=%#lx\n", *argv);
    printf("STACK:argv=%#lx,&argc=%#lx,&argv=%#lx\n",argv,&argc,&argv);
    printf("STACK:&ptr1=%#lx, &ptr2=%#lx\n", &ptr1,&ptr2);

    ptr2 = (char *)malloc(10);//PTR2->HEAP
    printf("HEAP:**argv=%#lx,ptr2=%#lx\n", ptr2,**argv);
    printf("argv[0]=%s, argv[0]=%#lx\n",argv[0],argv[0]);

    printf("BSS: &g_var1=%#lx, &s_var3=%#lx\n", &g_var1,&s_var3);
    printf("DATA:&g_var2=%#lx, &s_var4%#lx\n", &g_var2,&s_var4);

    strcpy(ptr2, "haha");
    printf("RO_DATA: ptr1=%#lx,  ptr2=%#lx\n", ptr1,ptr2);
    return 0;
}/*------------End of main---------------*/

运行结果:

COMMAND:*argv=0x7fff2a4b8822
STACK:argv=0x7fff2a4b7a18,&argc=0x7fff2a4b78fc,&argv=0x7fff2a4b78f0
STACK:&ptr1=0x7fff2a4b7908, &ptr2=0x7fff2a4b7900
HEAP:**argv=0x164b010,ptr2=0x2e612f2e
argv[0]=./a.out, argv[0]=0x7fff2a4b8822
BSS: &g_var1=0x600b94, &s_var3=0x600b90
DATA:&g_var2=0x600b74, &s_var40x600b78
RO_DATA: ptr1=0x4007b8, ptr2=0x164b010

参考:http://blog.csdn.net/xluren/article/details/8150723

时间: 2024-11-05 12:16:34

C/C++编译的程序占用的内存的相关文章

由C/C++编译的程序占用的内存分类

一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) : 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static):,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区

一个由C/C++编译的程序占用的内存

一个由C/C++编译的程序占用的内存分为以下几个部分  1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.  2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.  3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的

如何获知PHP程序占用多少内存

想要知道编写的 PHP 脚本需要占用多少内存么?很简单,直接使用 PHP 查看当前分配给 PHP 脚本的内存的函数 memory_get_usage() 就可以了. 下面是使用示例:赌王娱乐城 <?php echo memory_get_usage(), '<br />'; // 313864 $tmp = str_repeat('http://www.nowamagic.net/', 4000); echo memory_get_usage(), '<br />'; //

linux下查看程序占用多少内存

执行 ps auxVSZ(或VSS)列 表示,程序占用了多少虚拟内存:RSS列 表示, 程序占用了多少物理内存:虚拟内存可以不用考虑,它并不占用实际物理内存. 或执行top 命令 VIRT(或VSS)列  表示,程序占用了多少虚拟内存, 同 ps aux 中的 VSZ列:RES列 表示, 程序占用了多少物理内存, 同 ps aux 中的RSS列. 参考 http://blog.chinaunix.net/uid-20492804-id-265809.html

查看程序占用tomcat内存情况

近期,公司线上tomcat常常无缘无辜宕机.总结了一下定位问题的方法,仅供參考: 报错信息: Maximum number of threads (200) created for connector with address null and port 9443 # There is insufficient memory for the Java Runtime Environment to continue. # Cannot create GC thread. Out of system

C/C++编译的程序内存组成:

#include int main(){int a[1000000];//局部变量return 0;} 编译运行后发现溢出错误. #include int a[1000000];//全局变量int main(){return 0;} 编译运行后正常. 在解释原因前我们先看一下一个由C/C++编译的程序占用的内存分为几个部分: 1. 栈区(stack sagment):由编译器自动分配释放,存放函数的参数的值,局部变量的值等.在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区 域

C# WinForm应用程序降低系统内存占用方法总结

这篇文章主要介绍了C# WinForm应用程序降低系统内存占用方法总结,本文总结了9个方法,同时给出了一个定期清理执行垃圾回收代码,需要的朋友可以参考下 背景: 微软的 .NET FRAMEWORK 现在可谓如火如荼了.但是,.NET 一直所为人诟病的就是“胃口太大”,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资

C# Winform应用程序占用内存较大解决方法整理(转)

原文:http://www.jb51.net/article/56682.htm 背景: 微软的 .NET FRAMEWORK 现在可谓如火如荼了.但是,.NET 一直所为人诟病的就是“胃口太大”,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资源是只有启动时才用的. 以XP 系统为例子,程序启动后,打开任务管理器,

WPF:警惕TextBox会占用过多内存

问题源自这篇文章:WPF的TextBox产生内存泄露的情况. 整个问题是这样的,文章作者演示使用类似下方的代码来不停地像WPF的TextBox控件赋值: for (int i = 0; i < 10000; i++) { //tbx是界面上的TextBox变量 tbx.Text += string.Format("{0}\n", i); } 然后会出现程序占用过多内存的问题. 很快在那篇文章的评论中有人指出这个和WPF没有关系,因为频繁得拼接字符串会产生过多重复字符串对象,即使不