linux下进程内存布局及变量存储位置检查
进程的内存布局如下(虚拟内存):

它们分别从低地址向高地址增长
在linux中,存在三个全局符号:etext, edata, end分别指向文本段,初始化数据段,未初始化数据段结尾处的下一字节的地址。
所以我们可以在c程序中声明这些变量,然后定义一些变量再查看其地址是否在对应的地址范围内,可得出其变量被存储在哪个区中。
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
extern char etext, edata, end;
int a = 10;
void func()
{
int d = 666; //栈
printf("func = %p\n", func); //文本段
printf("局部变量d, &d = %p\n", &d);
}
int main()
{
int b = 100; //栈区
int *p = (int*)&edata;
int *c = (int*)malloc(sizeof(int)); //堆
*c = 99;
printf("etext = %10p\nedata = %10p\nend = %10p\n", &etext, &edata, &end);
printf("全局变量a, &a = %p\n", &a);
printf("局部变量b, &b = %p\n", &b);
printf("堆分配的内存, &(*c) = %p\n", &(*c));
printf("main = %p\n", main);
printf("a = %d\n", *(--p));
func();
return 0;
}输出如下:
etext = 0x557ed79928ed edata = 0x557ed7b93014 end = 0x557ed7b93018 全局变量a, &a = 0x557ed7b93010 局部变量b, &b = 0x7fff14f77454 堆分配的内存, &(*c) = 0x557ed7f6e260 main = 0x557ed799275f a = 10 func = 0x557ed79926fa 局部变量d, &d = 0x7fff14f77434
可以看出:
对于main: 0x557ed799275f
func: 0x557ed79926fa , 它们的地址都小于
etext: 0x557ed79928ed
所以可知main和func函数,都存储在文本区中。
全局变量a : 0x557ed7b93010
大于etext : 0x557ed79928ed
小于edata: 0x557ed7b93014
所以知道初始化的全局变量a在初始化数据区中,
其它以此类推。