转载于:https://blog.csdn.net/wu5215080/article/details/38899259

内存四区模型

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

 

1、内存四区:

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方

式类似于数据结构中的栈。
2、堆区(heap: 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回   收 。

注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、数据区:主要包括静态全局区和常量区,如果要站在汇编角度细分的话还可以分为很多小的区。
           全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变

量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

程序结束后有系统释放
常量区 :常量字符串就是放在这里的。 程序结束后由系统释放

4、代码区:存放函数体的二进制代码。

2、堆栈的生长方向:

1、堆栈的生长方向和存放数据增长方向不一样

图2、堆栈的生长方向

二:函数调用模型

变量三要素是:名称、大小、作用域。那么变量的生命周期是多长呢?

编译器是如何管理每个函数间变量的生命周期呢?

要研究变量的生命周期,而变量一般又是在函数中定义分配空间的。

因此下面研究一下变量作为函数参数和返回值传递分析

下面我们具体总结一下,各个函数的变量的生命周期

main里面的变量分配内存,函数fa(),函数fb()中的变量分配的内存空间它们的生命周期都是多长呢?

上述图1,已经说明了内存主要分为四区,因此每个函数中变量在堆栈的生命周期是不同的,

同时在函数调用的时候,先执行的函数最后才执行完毕

char*fa()
{

char*pa = "123456";//pa指针在栈区,“123456”在常量区,该函数调用完后指针变量pa就被释放了
 char*p = NULL;     //指针变量p在栈中分配4字节
 p=(char*)malloc(100);//本函数在这里开辟了一块堆区的内存空间,并把地址赋值给p
 strcpy(p, "wudunxiong 1234566");//把常量区的字符串拷贝到堆区
 return p;//返回给主调函数fb(),相对fa来说fb是主调函数,相对main来说,fa(),fb()都是被调用函数
}
char*fb()
{
 char*pstr = NULL;
 pstr = fa();
 return pstr;//指针变量pstr在这就结束
}

void main()

 char*str = NULL;
 str = fb();
 printf("str = %s\n",str);
 free(str);    //防止内存泄露,被调函数fa()分配的内存存的值通过返回值传给主调函数,然后主调函数释放内存
 str = NULL;//防止产生野指针
 system("pause");
}

总结:

1、主调函数分配的内存空间(堆,栈,全局区)可以在被调用函数中使用,可以以指针作函数参数的形式来使用

2、被调用函数分配的内存空间只有堆区和全局区可以在主调函数中使用(返回值和函数参数),而栈区却不行,因为栈区函数体运行完之后

这个函数占用的内存编译器自动帮你释放了。

3、一定要明白函数的主被调关系以及主被调函数内存分配回收,也就是后面接下几篇总结的函数的输入输出内存模型

11、C内存四区模型的更多相关文章

  1. C语言进阶之路(一)----C语言的内存四区模型

    内存四区模型:操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域:1.栈区:存放局部变量,用完由操作系统自动释放2.堆区:动态分配给程序的内存区域,由程序员手动释放3.数据区: ...

  2. C语言之内存四区模型和函数调用模型

      内存四区模型 流程说明1.操作系统把物理硬盘代码load到内存2.操作系统把c代码分成四个区3.操作系统找到main函数入口执行 1.内存四区: 一个由c/C++编译的程序占用的内存分为以下几个部 ...

  3. C语言的内存四区模型和函数调用模型

    首先是操作系统将代码程序加载到内存中 然后将内存分为4个区 栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放. 堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构. ...

  4. 面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期

    1.面向对象主要涉及  构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联 ...

  5. C++ 数据类型提高+内存四区

    # 这一章节全部是C语言的内容# 数据类型提高**注意**1.数组作为形参会退化为指针(验证,传参后用sizeof进行打印,可以看出打印出数组的字节为一字节)2.形参在函数上和函数内是一样的,只不过对 ...

  6. C语言提高 (1) 第一天 数据类型本质与内存四区

    (物联网的分层的概念 b/s c/s 结构 习惯: 在C语言 0 函数执行成功 <0是错误 >1做一些返回值处理 3 课前准备 工作经验,记录 4 数据类型的本质 数据类型的本质是固定大小 ...

  7. C语言内存四区的学习总结(三)---- 栈区

    接上篇内存四区的堆区的总结,下面做一些栈区的相关总结. 一.栈区的分析: 就下面测试程序 #include "stdio.h" #include "string.h&qu ...

  8. C语言内存四区的学习总结(一)---- 静态区

    最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享. 一.内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如 ...

  9. C++变量存储类别和内存四区

    变量存储类别 变量声明/定义的一般形式: 存储类别 数据类型 变量名 存储类别指的是数据在内存中存储的方法.存储方法分为静态存储和动态存储两大类.标准C语言为变量.常量和函数定义了4种存储类型:ext ...

随机推荐

  1. jetbrains idea/webstorm等(注册,激活,破解码,一起支持正版,最新可用)(2017.3.16更新)【转】

    选择 License server (2017.3.16更新) http://idea.imsxm.com/ 详细请参考:  http://www.cnblogs.com/ys-wuhan/p/584 ...

  2. FeiQ项目

    一.映射表 UDPMeditor.h中: typedef void (UDPMeditor::*pFunc)(char*,long); struct ProtocolMap { PackdefType ...

  3. 201671010127 2016—2017-2 java编程中遇到的问题

    学习了Java的一些基本语法后,心里的激动无法按捺,总是比较Java与C语言语法的区别,一有闲时间就会用刚学的Java基本语法写一些简单的程序.这不,一不小心又陷入了困难,本人在此诚挚的请教各位园友, ...

  4. ORA-00372此时无法修改文件5 ORA-01110数据文件5'M:\WWFDATA.dbf'

    错误提示如下图: ORA-00372此时无法修改文件5 ORA-01110数据文件5'M:\DB_DATA\SEINESCMDB\WWFDATA_DATA01.dbf' 分析原因及解决方法: 1.查看 ...

  5. 238. Product of Array Except Self 由非己元素形成的数组

    [抄题]: Given an array of n integers where n > 1, nums, return an array output such that output[i]  ...

  6. 383. Ransom Note 在字典数组中查找笔记数组

    [抄题]: Given an arbitrary ransom note string and another string containing letters from all the magaz ...

  7. c语言学习笔记 break语句

    比如 for() { for() { break; } } 那个break语句只是跳出它所在的那个for循环,不会把最外面的for循环都跳出去.

  8. 正则表达式复习 (?<=) (?=)

    1.首先值得一说的是"<" 和">" 不是元字符 "."是元字符 ,连接字符"-",即使在字符组内部也不一定 ...

  9. 黑盒测试实践--Day7 12.1

    黑盒测试实践--Day7 12.1 今天完成任务情况: 录制小组作业中的自动化测试工具实践视频 汇总大家提交的各种作业模块,打包完成小组共同作业 小组成员完成个人情况说明后在截止时间前分别提交作业 小 ...

  10. Gson 配置解析

    之前项目用到了gson对json和Java类之间互转,现在将gson的配置总结一下. 首先,创建gson对象之间,建立gsonbuilder对象,并配置 // 不导出实体类中没有用@Expose注解的 ...