本文描述了linux进程中代码段,全局变量,堆栈,环境变量,命令行参数地址在内存中的布局,人非圣贤,孰能无过,请各位大牛多多提出意见,有错误也可指出,作者想进步,想进步..千呐!!
先来看一个小程序,分析一下进程中全局变量(初始化未初始化),堆,栈,代码段地址在内存中布局:
#include <stdio.h> #include <stdlib.h> int g_val = 100; int arr[50]; void fun() { printf("address space program\n"); } int main() { char* heap1 = (char*)malloc(20); char* heap2 = (char*)malloc(20); char* heap3 = (char*)malloc(20); int stack[50]; printf("code address: %p\n",fun); printf("init address: %p\n",&g_val); printf("uninit address: %p~%p\n",&arr[0], &arr[50]); printf("heap address:%p~%p~%p\n",heap1, heap2, heap3); printf("stack address: %p~%p\n",&stack[0], &stack[50]); return 0; }
显示结果:
上面这个程序就可以分析出来全局变量,堆栈,代码段的内存布局,接下来来看第二个小程序,来分析环境变量和命令行参数地址在内存中布局:
#include <stdio.h> int main(int argc, char* argv[], char* env[]) { int i = 0; int stack[50]; printf("stack[0]:%p\n", &stack[0]); printf("stack[50]:%p\n", &stack[50]); for(; argv[i] != NULL; ++i) { printf("argv[%d] = %s:%p\n", i,argv[i],argv[i]); } for(i = 0; env[i] != NULL; ++i) { printf("env[%d]:%p\n",i, env[i]); } return 0; }显示结果:
结合这两个小程序我们就可以知道进程中全局变量,代码段,堆栈,命令行参数,环境变量的在内存中的布局,看下图:
神奇的里纳克斯,神奇进程地址空间。^_^