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

流程说明
1、操作系统把物理硬盘代码load到内存
2、操作系统把c代码分成四个区
3、操作系统找到main函数入口执行
1、内存四区:
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方
式类似于数据结构中的栈。
2、堆区(heap: 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、数据区:主要包括静态全局区和常量区,如果要站在汇编角度细分的话还可以分为很多小的区。
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变
量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
程序结束后有系统释放
常量区 :常量字符串就是放在这里的。 程序结束后由系统释放
4、代码区:存放函数体的二进制代码。
2、堆栈的生长方向:
1、堆栈的生长方向和存放数据增长方向不一样
二:函数调用模型
变量三要素是:名称、大小、作用域。那么变量的生命周期是多长呢?
编译器是如何管理每个函数间变量的生命周期呢?
要研究变量的生命周期,而变量一般又是在函数中定义分配空间的。
因此下面研究一下变量作为函数参数和返回值传递分析
下面我们具体总结一下,各个函数的变量的生命周期
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、一定要明白函数的主被调关系以及主被调函数内存分配回收,也就是后面接下几篇总结的函数的输入输出内存模型
C语言之内存四区模型和函数调用模型的更多相关文章
- C语言进阶之路(一)----C语言的内存四区模型
内存四区模型:操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域:1.栈区:存放局部变量,用完由操作系统自动释放2.堆区:动态分配给程序的内存区域,由程序员手动释放3.数据区: ...
- C语言的内存四区模型和函数调用模型
首先是操作系统将代码程序加载到内存中 然后将内存分为4个区 栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放. 堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构. ...
- C语言内存四区的学习总结(三)---- 栈区
接上篇内存四区的堆区的总结,下面做一些栈区的相关总结. 一.栈区的分析: 就下面测试程序 #include "stdio.h" #include "string.h&qu ...
- C语言内存四区的学习总结(一)---- 静态区
最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享. 一.内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如 ...
- C语言提高 (1) 第一天 数据类型本质与内存四区
(物联网的分层的概念 b/s c/s 结构 习惯: 在C语言 0 函数执行成功 <0是错误 >1做一些返回值处理 3 课前准备 工作经验,记录 4 数据类型的本质 数据类型的本质是固定大小 ...
- 深入理解C语言-深入理解内存四区
数组与指针 当数组做函数参数的时候,会退化为一个指针 此时在函数内是得不到数组大小的 因此,数组做函数参数的时候需要传递数组大小,也就是多传递一个参数 void func(int arr[], int ...
- 11、C内存四区模型
转载于:https://blog.csdn.net/wu5215080/article/details/38899259 内存四区模型 图1.内存四区模型流程说明1.操作系统把物理硬盘代码load到内 ...
- C语言内存四区的学习总结(二)---- 堆区
接上篇,内存四区的分析-静态区,下面来说明一下堆区总结. 堆区分析: 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回 就下面的程序: #inc ...
- 面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期
1.面向对象主要涉及 构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联 ...
随机推荐
- sql语句select group by order by where一般先后顺序
写的顺序:select ... from... where.... group by... having... order by..执行顺序:from... where...group by... h ...
- Shell下syntax error: operand expected (error token is “-”)
在这个监控实时网口速率的脚本中,第21,22行存在错误: #!/bin/bash #Modified by lifei4@datangmobile.cn echo ===DTmobile NetSpe ...
- CNI插件实现框架---以loopback为示例
以最简单的loopback插件作为实例,来分析CNI plugin的执行流程 // cni/plugins/loopback/loopback.go 1.func main() main函数只是简单地 ...
- 用户登录失败,该用户与可信SQL Server连接无关联,错误:18452
安装好SQLServer2005(或者装了Visual Studio 2008后自带的SQLServer2005)用SQL Server身份验证的登录的时候有时候会发生这种情况: 这样的错误的原因是: ...
- 收藏一些好用的c语言数据结构
14.redis内置的链表,非常好 adlist.c /* adlist.c - A generic doubly linked list implementation * * Copyright ( ...
- Linux的进程/线程通信方式总结(转)
Linux系统中的进程通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通 ...
- Dora.Interception, 为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式
相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...
- 移动app自动化测试
原文出处https://www.toutiao.com/i6473606106970063374/ 原文作者是今日头条的:一个字头的诞生 在此感谢原文作者的无私分享! 移动App自动化测试(一) 目前 ...
- IOS中快速集成短信SDK验证开发(SMSSDK),IOS开发中如何设置手机验证码
[转载请注明出处] sdk是别人的,我只是下载来集成一下. smssdk下载网站:http://www.mob.com/(也有其他很多网站有类似SDK,譬如https://www.juhe.cn/等等 ...
- maven项目打WAR包记录
打了个war包,各种不顺,也是以前没打过的原因,眼高手低了…… cmd 进入项目目录 打开 运行----cmd 进入命令窗口 键入 cd 回车 输入E\:mars\cdc 键入 mvn clean p ...