- #include <stdlib.h>
-
-
extern char **environ;
-
int globalvar = 0;
-
const int globalconst;
-
-
int main(int argc, char *argv[])
-
{
-
static int staticvar = 0;
-
int localvar;
-
const int localconst;
-
char localarray[16];
-
char *p1;
-
char *p2="1111111111111";
-
char *p3;
-
-
p1=(char*)malloc(16);
-
p3=(char*)malloc(16);
-
-
printf("item \t\taddress\n");
-
printf("---------------------\n");
-
printf("main entry\t0x%x\n",main);
-
printf("staticvar\t0x%x\n",&staticvar);
-
printf("globalvar\t0x%x\n",&globalvar);
-
printf("globalconst\t0x%x\n",&globalconst);
-
printf("111111111\t0x%x\n",p2);
-
printf("argc\t\t0x%x\n",&argc);
-
printf("argv\t\t0x%x\n",&argv);
-
printf("argv[0]\t\t0x%x\n",argv);
-
printf("localvar\t0x%x\n",&localvar);
-
printf("localconst\t0x%x\n",&localconst);
-
printf("localarray\t0x%x\n",localarray);
-
printf("malloc1\t\t0x%x\n",p1);
-
printf("malloc2\t\t0x%x\n",p3);
-
printf("environ[0]\t0x%x\n",environ);
-
printf("environ[0][0]\t0x%x\n",environ[0]);
-
return;
-
}
实验结果:
lisong@lisong:~/code/experiment/proc/proc_struct$ ./proc_struct
item address
---------------------
main entry 0x80484c4
staticvar 0x804a030
globalvar 0x804a02c
globalconst 0x804a034
111111111 0x8048730
argc 0xbfcec010
argv 0xbfcebfcc
argv[0] 0xbfcec0b4
localvar 0xbfcebfdc
localconst 0xbfcebfd8
localarray 0xbfcebfec
malloc1 0x90a6008
malloc2 0x90a6020
environ[0] 0xbfcec0bc
environ[0][0] 0xbfcec57f
lisong@lisong:~/code/experiment/proc/proc_struct$ ./proc_struct
item address
---------------------
main entry 0x80484c4
staticvar 0x804a030
globalvar 0x804a02c
globalconst 0x804a034
111111111 0x8048730
argc 0xbfe50580
argv 0xbfe5053c
argv[0] 0xbfe50624
localvar 0xbfe5054c
localconst 0xbfe50548
localarray 0xbfe5055c
malloc1 0x8e48008
malloc2 0x8e48020
environ[0] 0xbfe5062c
environ[0][0] 0xbfe5257f
lisong@lisong:~/code/experiment/proc/proc_struct$ ./proc_struct
item address
---------------------
main entry 0x80484c4
staticvar 0x804a030
globalvar 0x804a02c
globalconst 0x804a034
111111111 0x8048730
argc 0xbfeaede0
argv 0xbfeaed9c
argv[0] 0xbfeaee84
localvar 0xbfeaedac
localconst 0xbfeaeda8
localarray 0xbfeaedbc
malloc1 0x83d0008
malloc2 0x83d0020
environ[0] 0xbfeaee8c
environ[0][0] 0xbfeaf57f
运行多次发现:
1、代码段和全局数据段的内存地址没有变化;而堆栈区的地址每次都不同。基本摆布结构按照低地址到高地址排序,依次是:
代码段
已初始化全局数据段
未初始化全局数据段
堆
栈
命令行参数
环境表
2、堆的增长方向: 低地址-->高地址
3、栈的增长方向:高地址-->低地址。变量的排布顺序似乎是不定的,但变量之间的地址偏移总是一样,可见变量的分布结构是固定的。由高地址到低地址排序,变量依次为:
localarray
localvar
localconst
推测编译器是按照一定的变量类型规则排布的,具体方式有待研究。
4、代码段是只读的,一个程序运行的多个进程之间共享代码段。如果程序中做修改代码段数据的操作,程序会发生段错误。
程序结构:
lisong@lisong:~/code/experiment/proc/proc_struct$ size proc_struct
text data bss dec hex filename
1926 268 24 2218 8aa proc_struct
程序的基本结构有三段:代码段text,数据段,非初始化数据段bss,其中:text和data在进程执行的时候直接复制到内存中,bss中的变量由内核运行程序时赋值为0.
阅读(700) | 评论(0) | 转发(0) |