C语言中内存分布及程序运行加载过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中内存分布及程序运行加载过程相关的知识,希望对你有一定的参考价值。

参考技术A

一个程序内存分配:
下图是APUE中的一个典型C内存空间分布图(虚拟内存)

例如:

int g1=0, g2=0, g3=0;
int max(int i)

int m1=0,m2,m3=0, p_max;
static n1_max=0,n2_max,n3_max=0;
p_max = (int
)malloc(10);
printf("打印max程序地址\\n");
printf("in max: 0xx\\n\\n",max);
printf("打印max传入参数地址\\n");
printf("in max: 0xx\\n\\n",&i);
printf("打印max函数中静态变量地址\\n");
printf("0xx\\n",&n1_max); //打印各本地变量的内存地址
printf("0xx\\n",&n2_max);
printf("0xx\\n\\n",&n3_max);
printf("打印max函数中局部变量地址\\n");
printf("0xx\\n",&m1); //打印各本地变量的内存地址
printf("0xx\\n",&m2);
printf("0xx\\n\\n",&m3);
printf("打印max函数中malloc分配地址\\n");
printf("0xx\\n\\n",p_max); //打印各本地变量的内存地址
if(i) return 1;
else return 0;

int main(int argc, char **argv)

static int s1=0, s2, s3=0;
int v1=0, v2, v3=0;
int p;
p = (int
)malloc(10);
printf("打印各全局变量(已初始化)的内存地址\\n");
printf("0xx\\n",&g1); //打印各全局变量的内存地址
printf("0xx\\n",&g2);
printf("0xx\\n\\n",&g3);
printf("======================\\n");
printf("打印程序初始程序main地址\\n");
printf("main: 0xx\\n\\n", main);
printf("打印主参地址\\n");
printf("argv: 0xx\\n\\n",argv);
printf("打印各静态变量的内存地址\\n");
printf("0xx\\n",&s1); //打印各静态变量的内存地址
printf("0xx\\n",&s2);
printf("0xx\\n\\n",&s3);
printf("打印各局部变量的内存地址\\n");
printf("0xx\\n",&v1); //打印各本地变量的内存地址
printf("0xx\\n",&v2);
printf("0xx\\n\\n",&v3);
printf("打印malloc分配的堆地址\\n");
printf("malloc: 0xx\\n\\n",p);
printf("======================\\n");
max(v1);
printf("======================\\n");
printf("打印子函数起始地址\\n");
printf("max: 0xx\\n\\n",max);
return 0;

打印结果:

ELF目标文件格式的最前端是 ELF****文件头(****ELF Header****)
包含了描述整个文件的基本属性,如ELF版本、目标机器型号、 程序入口地址
3 加载:

以上是关于C语言中内存分布及程序运行加载过程的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶—— 文件操作(详解)

2.C语言------程序运行为什么需要内存2

C语言 静态变量的初始化

Java程序在内存中运行详解

C语言中内存分配

C语言中内存分配 (转)