linux c程序内存分布

/*高地址
 *  
 *      栈    局部变量(向下增长)
 *      堆    动态申请内存(向上增长)
 *      bss   未初始话全局变量(初始化为0)   
 *      
 *      data  只读数据段 (已始化全局变量,静态变量,常量)
 *      code  只读代码段
 *低地址
 * */

 #include <stdlib.h>
 #include <stdio.h>
 /*常量*/
 const int ca = 10 ;//全局常量 data区

 static sa;//静态,data区
 int a;//全局未初始化 bss 区
 int b = 4;//全局初始化 data区
 
 /*常量*/
 const int ca = 10 ;//全局常量 data区
 
 void func1(); //子函数,代码区
 void func2();//子函数,代码区
 int main(void)
 {
     /*申请一块内存  堆*/
     int *p = NULL;//栈
     p = (int *)malloc(sizeof(int));
 
     *p = 5;
     char *p1 = "hello world";//data区
     char p2[] = "hello world";//栈区
     /*局部变量*/
     int aa;
 
     /*栈区*/
     printf("***********栈区************\n");
     printf("局部变量:%p\n",&aa);
     aa = 5;
     printf("局部变量:%p\n",aa);
     printf("p2:%p\n",p2);
 
     printf("\n\n");
     /*堆区*/
     printf("*********堆区**************:\n");
     printf("动态内存区:%p\n",&p);
     printf("动态内存区:%p\n",p);
 
     /*非初始化数据段*/
     printf("\n\n");
     printf("*********bss 区************:\n");
     printf("非初始化全局变量:%p\n",&a);
     printf("\n\n");
 
     /*只读区*/
     printf("********only read 只读区********\n");
     printf("data 段:\n");
     printf("全局初始化变量:%p\n",&b);
 
     printf("p1:%p\n",p1);
     printf("常量:%p\n",&ca);
     printf("静态变量:%p\n",&sa);
 
     printf("\n\n");
     printf("代码段:\nmain地址:%p\n",main);
     printf("子函数2:%p\n",func2);
     printf("子函数1:%p\n",func1);
 }
 
 void func1()
 {
     printf("子函数\n");
 }
 
 void func2()
 {
     printf("子函数\n");
 }

结果:

***********栈区************
局部变量:0xbfca4bb8
局部变量:0x5
p2:0xbfca4bbc


*********堆区**************:
动态内存区:0xbfca4bc8
动态内存区:0x9c34008


*********bss 区************:
非初始化全局变量:0x8049a00


********only read 只读区********
data 段:
全局初始化变量:0x80499f0
p1:0x80486e8
常量:0x80486e4
静态变量:0x80499fc


代码段:
main地址:0x8048424
子函数2:0x804860a
子函数1:0x80485f6

附上图片,转载自:http://my.oschina.net/pollybl1255/blog/140323


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。