首先,任何一个程序在执行的时候都会把其代码、变量等储存在一个地方。也就是说在内存中分四个区域来存储。
四个区域:
1.代码区;
2.全局栈区;
3.堆;
4.局部栈。
同个一个小例子可以简单看一下:
我们利用linux来写一段代码,
printf("%d\n",getpid());
while(1);
}
编译,生成一个可执行文件,然后可以看到一个pid号码.while(1)的意思是让程序一直运行下去,因为如果程序停止,进程就不存在了,pid号也不存在,并且没法看其内存分布了。运行程序,然后重新打开一个终端窗口,进入/proc目录,然后进入对应的pid号的文件夹下。文件夹下有很多东西,其中cwd是工作路径,exe指向执行程序,fd,cpuset是程序用cpu的信息,maps是所有的内存结构,对就看一下maps。
然后可以看到内存结构,main(程序名字)那个空间中权限里带x的就是代码区了,可以看到,main函数和add函数都在这里面;stack这个空间就是局部栈了,存储函数中的一些变量;而可以看到存储全局变量的那块空间是全局栈,全局栈一般都有w权限;而malloc对应的就是堆了。
所以,a1,a2在全局区,a3在代码区,b1在栈中,b2在全局区,b3在局部站区,p1在堆中,main在代码区,add在代码区。