系统相关
首页 > 系统相关> > C程序运行对应的内存分布关系

C程序运行对应的内存分布关系

作者:互联网

关注v-x-公-众-号:【嵌入式基地
后-台-回-复:【电赛】 即可获资料
回复【编程】即可获取
包括有:C、C++、C#、JAVA、Python、JavaScript、PHP、数据库、微信小程序、人工智能、嵌入式、Linux、Unix、QT、物联网、算法导论、大数据等资料

在这里插入图片描述
原文链接 点击查看

程序运行时的内存分区主要分为BSS段、数据段、代码段、堆、栈。

程序中内存分布图
APUE中的C内存分布图

程序测试

int g1=0, g2=0, g3=0;
static 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;
}

根据输出结果可以看出,传入的参数,局部变量,都是在栈顶分布,随着子函数的增多而向下增长。函数的调用地址(函数运行代码),全局变量,静态变量都是在分配内存的低部存在,而malloc分配的堆则存在于这些内存之上,并向上生长。

简单说明

在这里插入图片描述

标签:0xx,程序运行,int,max,打印,内存,printf,对应
来源: https://blog.csdn.net/m0_51061483/article/details/116380405