测试代码:test_men.c
1
#include
2
#include
3
4 int i1;
//BBS段
5 int i2 = 2; //
全局区
6 const int i3 = 3;
// 只读常量区
7 static int i4 =
4; // 全局区
8 static int i5 ;
// BBS段
9 int main ()
{
10
int i6; //
栈区
11
static int i7;
// BBS
12
static int i8 = 8;
//全局区
13
const int i9 = 9;
// 栈区
14
int* p =(int*)
malloc(sizeof(int)); // 指向堆区,自身地址在栈区
15
char* s1 = "abcd12";
//指向只读常量区,自身地址在栈区
16
char s2[] = "abcd123";
//栈区存放数据
17
// 打印各变量值和地址
18
printf("i1=%d, %p\n", i1,
&i1);
19
printf("i2=%d, %p\n", i2,
&i2);
20
printf("i3=%d, %p\n", i3,
&i3);
21
printf("i4=%d, %p\n", i4,
&i4);
22
printf("i5=%d, %p\n", i5,
&i5);
23
printf("i6=%d, %p\n", i6,
&i6);
24
printf("i7=%d, %p\n", i7,
&i7);
25
printf("i8=%d, %p\n", i8,
&i8);
26
printf("i9=%d, %p\n", i9,
&i9);
27
28
printf("p: %p\n",
p);
29
printf("s1=%s, s1:%p,
abcd12:%p\n", s1, &s1, s1);
30
printf("s2=%s, s2: %p,
abcd123:%p\n", s2, &s2, s2);
31
32
printf("pid=%d\n",
getpid());
33
//while(1);
34
return 0;
35 }
测试结果:
i1=0, 0x804a03c
i2=2, 0x804a020
i3=3, 0x8048750
i4=4, 0x804a024
i5=0, 0x804a034
i6=-1218297434, 0xbfa2cf94
i7=0, 0x804a038
i8=8, 0x804a028
i9=9, 0xbfa2cf98
p: 0x9155008
s1=abcd12, s1:0xbfa2cf9c,
abcd12:0x8048754
s2=abcd123, s2: 0xbfa2cfa4,
abcd123:0xbfa2cfa4
pid=2973
对比各变量地址,可以区分不同区域。
i3=3,
0x8048750
abcd12: 0x8048754
// 只读常量区,加了const
的全局变量(i3)和字符串字面值“abcd12”被存到只读常量区。
i2=2,
0x804a020
i4=4,
0x804a024
i8=8,
0x804a028 //全局区,初始化的全局变量(i2)和初始化的static变量(i4,
i8)。
i1=0,
0x804a03c
i5=0,
0x804a034
i7=0, 0x804a038 //BBS段,存储未初始化的全局变量和未初始化的static变量,并自动置零。所以i1, i5,
i7 被 置零了。从地址上来看,BBS段紧接在全局区后面。
p->0x9155008 //堆区,
从地址来看,离前面的数据有点远,可能从安全的角度来考虑,防范程序员操作失误
影响前面的数据。
i6=-1218297434,
0xbfa2cf94
i9=9,
0xbfa2cf98
s1:
0xbfa2cf9c
s2: 0xbfa2cfa4 //栈区:定义的局部变量都在这里
所以,进程的内存区域排序如下:(升序)
代码区
只读常量区
全局区
BSS段
堆区
栈区-在3G左右的位置
查看进程(pid)文件地址 cat
/proc/pid(用得到的pid号码替代)/maps