前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序内存四区之模型建立

程序内存四区之模型建立

作者头像
编程范 源代码公司
发布2019-08-06 10:34:07
6740
发布2019-08-06 10:34:07
举报
文章被收录于专栏:C语言及其他语言

内存四区建立

代码语言:javascript
复制
流程说明:
    1、操作系统把物理硬盘代码load到内存
    2、操作系统把c代码分成四个区
    3、操作系统找到main函数入口执行

各区元素分

函数调用模型
文字说明:
代码语言:javascript
复制
将操作系统运行状态入栈,
    将main函数的返回地址入栈,
    将main函数的参数入栈,
    将main函数的运行状态入栈,
    里面有fa函数,
    将fa函数的返回地址入栈,
    将fa函数的参数入栈,
    将fa函数的运行状态入栈,
    里面有fb函数,
    将fb函数的返回地址入栈
    将fb函数的参数入栈
    然后逆序出栈
内存四区模型和函数调用模型变量传递分析
代码语言:javascript
复制
1、一个主程序有n函数组成,c++编译器会建立有几个堆区?有几个栈区?
2、函数嵌套调用时,实参地址传给形参后,C++编译器如何管理变量的生命周期?
分析:函数A,调用函数B,通过参数传递的变量(内存空间能用吗?)

那么 fa申请的内存,可以被main使用吗?

静态储存区理解:
代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char * getStr1()
{
    char *p1 = "abcdefg2";
    return p1;
}
char *getStr2()
{
    char *p2 = "abcdefg2";
    return p2;
}

void main()
{
    char *p1 = NULL;
    char *p2 = NULL;
    p1 = getStr1();
    p2 = getStr2();

    //打印p1 p2 所指向内存空间的数据
    printf("p1:%s , p2:%s \n", p1, p2);

    //打印p1 p2 的值
    printf("p1:%d , p2:%d \n", p1, p2);

    printf("hello...\n");
    system("pause");
    return ;
}

程序的静态区模型(简化)

堆栈区理解:
代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

//堆
char *getMem(int num)
{
    char *p1 = NULL;
    p1 = (char *)malloc(sizeof(char) * num);
    if (p1 == NULL)
    {
        return NULL;
    }
    return p1;
}

//栈
//注意 return不是把内存块 64个字节,给return出来,而是把内存块的首地址(例如内存的标号0xaa11) ,返回给 tmp
// 理解指针的关键,是内存. 没有内存哪里有指针
char *getMem2()
{
    char buf[64]; //临时变量 栈区存放
    strcpy(buf, "123456789");
    //printf("buf:%s\n", buf);
    return buf;
}

int  main()
{
    char *tmp = NULL;
    tmp = getMem(10);
    if (tmp == NULL)
    {
        return 0;
    }
    strcpy(tmp, "111222333"); //向tmp做指向的内存空间中copy数据

    printf("hello..tmp:%s.\n", tmp);
    system("pause");
    return 0;
}

程序的堆栈区模型(简化)

测试stack生长方向
代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

//栈的开口向上向下,,测试 release和dubug;
//一般认为:栈开口向下
//不管栈开口向上还是向下,buf的内存地址buf+1,永远向上的..
int main()
{
    int a;
    int b ;

    char buf[128];  //静态联邦的时候 buf所代表的内存空间的标号 就已经定义下来了....

    printf("&a:%d , &b: %d \n", &a, &b);
    system("pause");
    return 0;
}

图示

膜拜大佬请点击阅读原文

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程范 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数调用模型
  • 文字说明:
  • 内存四区模型和函数调用模型变量传递分析
  • 静态储存区理解:
  • 堆栈区理解:
    • 测试stack生长方向
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档