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在初始化数据区中,
其它以此类推。