linux下进程内存布局及变量存储位置检查

进程的内存布局如下(虚拟内存):

            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在初始化数据区中,

其它以此类推。