内存结构理解

来源:互联网 发布:linux libsensors.so 编辑:程序博客网 时间:2024/06/07 00:52

对于C语言的学习首先要搞清楚C程序在内存中的分布。

 

1,在ceontos系统终端中


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <unistd.h> 
  4.  
  5. int add(int a,int b) 
  6.     return (a+b); 
  7.  
  8. int a1 = 1; 
  9. static int a2 = 11; 
  10. const int a3 = 111; 
  11.  
  12. int main() 
  13.     printf("pid:%p\n", getpid());//输出当前程序的进程ID 
  14.     int b1 = 2; 
  15.     static int b2 = 22; 
  16.     const int b3 = 222; 
  17.      
  18.     int* p = malloc(sizeof(int)); 
  19.      
  20.     //以下输出变量和函数的地址 
  21.     printf("a1:%p\n", &a1); 
  22.     printf("a2:%p\n", &a2); 
  23.     printf("a3:%p\n", &a3); 
  24.     printf("b1:%p\n", &b1); 
  25.     printf("b2:%p\n", &b2); 
  26.     printf("b3:%p\n", &b3); 
  27.     printf("p:%p\n", p); 
  28.     printf("add:%p\n", add); 
  29.     printf("main:%p\n", main); 
  30.      
  31.     while(1); 
  32.     //使这个函数一直运行 
  33.     //在linux下,cd /proc/进程ID/ 目录下,cat maps文件 
  34.     //此文件为此程序变量,函数映射到内存中信息 
  35.     //当程序返回时,进程ID这个目录就会自动删除,为查看maps文件中的信息 
  36.     //所以要确保程序不返回 
  37.     return 0; 
2,编译add.c文件,并运行

,

3,查看这个程序的进程信息:cat /proc/进程ID/maps


上图就是每个变量,函数在内存中地址。

黄色代表代码区

add为函数

main为函数

a3为const全局变量


绿色代表全局区

a1为全局变量

a2为全局静态变量

b2局部静态变量


蓝色代表堆区

p1为malloc动态分配空间的地址


紫色代表栈区

b1为自动变量(局部变量)

b3为const的局部变量


4,从以上分析中可以得出:

一个C语言程序在内存空间中分为4个基本部分

(1)代码区

(2)全局区

(3)堆

(4)栈

 

 

 

 

本文转载自:http://blog.csdn.net/gaoxin12345679/rss/list

0 0
原创粉丝点击