深入理解C语言-深入理解内存四区
数组与指针
当数组做函数参数的时候,会退化为一个指针
此时在函数内是得不到数组大小的
因此,数组做函数参数的时候需要传递数组大小,也就是多传递一个参数
void func(int arr[], int num)
{
···
}
若存在以上函数,c/c++编译器在编译的时候,会将数组优化为一个指针,指向数组的首地址,因此无法通过sizeof获得数组大小
以下可看作是c/c++编译器的优化过程
int a[10] => int a[] => int *p
void func(int *p, int num)
{
···
}
实参与形参
在函数调用的时候,实参的值机械的传递给形参
形参:
- 写在函数里面和函数上边,对C/C++编译器没有区别
- 写在函数上边多了对外属性
- 入栈时候从右至左入栈
数据类型的本质
按照上图,数据类型又可分为简单数据类型和复杂数据类型
简单数据类型和复杂数据类型的处理方式不一样
在处理复杂数据类型的时候,不能按照简单数据类型的处理方式去处理
例如,存在 int a[10]
数组,那么 &a
的值和 a
的值相同,但是 &a + 1
和 a + 1
的值却不相同,原因是前者代表的是一个数组地址,后者代表的是一个元素地址,前者加一,指出数组,而后者加一则是相当于指向下一个元素的地址,前者移动 sizeof(a)
字节,后者移动 sizeof(int)
字节
C语言规定数组名代表数组首元素地址,&a代表整个数组
数据类型的本质就是告诉编译器开辟内存的大小,就是一个指明开辟内存大小的说明性标签,也就是创建变量的模具,是固定内存大小的别名
数据类型的大小和别名
在C语言中,专门有一个操作符sizeof用来得到数据类型的大小,其大小在编译时候便已经确定
由于数据类型只是一个标识,故可以使用typedef定义别名
变量的本质
既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量
变量本质:(一段连续)内存空间的别名,标号
- 程序通过变量来申请和命名内存空间
- 通过变量名访问内存空间
由于变量的本质就是内存空间的别名,故要修改变量的值,无外乎就两种方式 - 直接:通过变量名,也就是别名修改
- 间接:内存有地址编号,拿到地址编号也可以修改内存
- 引用修改(C++)
变量三要素(名称、大小、作用域)
- 对内存可读可写
- 通过变量向内存中读写数据,而不是像变量读写数据
- 向变量代表的数据空间读写数据
数据类型和变量的关系
C语言规定:通过数据类型,定义变量
内存四区
流程说明
- 操作系统把物理硬盘代码load到内存
- 操作系统把c代码分成四个区
- 操作系统找到main函数入口执行
区块 | 作用 |
---|---|
栈区(stack) | 由编译器自动分配释放,存放函数的参数值,局部变量的值等 |
堆区(heap) | 一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收 |
全局区(静态区)(static) | 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放 |
常量区 | 字符串常量和其他常量的存储位置,程序结束后由操作系统释放 |
程序代码区 | 存放函数体的二进制代码 |
函数调用模型
main()调用fa(),fa()调用fb()
主调函数分配的内存,可以在被调函数中使用(指针做函数参数)
在fa(),fb()中分配的内存,如果实在栈区,不可在main()中调用,如果在堆区,全局区,可以在main()中调用,注意内存的释放问题
在被调用的函数中malloc的内存,首地址传递给调用函数有两种方法
- return
- 指针做函数参数
内存四区和函数调用变量传递
一个单进程主程序有n个函数组成,C++编译器只会分配一个堆区,一个栈区
堆栈属性说明
栈(stack):向下生长
堆(heap):向上生长
Heap、stack生长方向和内存存放方向是两个不同概念
深入理解C语言-深入理解内存四区的更多相关文章
- C++ 内存四区 理解总结
内存模型图(4G) 整体简单说明 32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中 03G是用户空间**,**34G是内核空间即3G用户空间和1G内核空间,不同进程相同的逻辑地 ...
- 深入理解C语言-深入理解指针
关于指针,其是C语言的重点,C语言学的好坏,其实就是指针学的好坏.其实指针并不复杂,学习指针,要正确的理解指针. 指针是一种数据类型 指针也是一种变量,占有内存空间,用来保存内存地址 指针就是告诉编译 ...
- C语言的内存四区模型和函数调用模型
首先是操作系统将代码程序加载到内存中 然后将内存分为4个区 栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放. 堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构. ...
- C语言内存四区的学习总结(一)---- 静态区
最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享. 一.内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如 ...
- C语言提高 (1) 第一天 数据类型本质与内存四区
(物联网的分层的概念 b/s c/s 结构 习惯: 在C语言 0 函数执行成功 <0是错误 >1做一些返回值处理 3 课前准备 工作经验,记录 4 数据类型的本质 数据类型的本质是固定大小 ...
- C语言内存四区的学习总结(三)---- 栈区
接上篇内存四区的堆区的总结,下面做一些栈区的相关总结. 一.栈区的分析: 就下面测试程序 #include "stdio.h" #include "string.h&qu ...
- C语言内存四区的学习总结(二)---- 堆区
接上篇,内存四区的分析-静态区,下面来说明一下堆区总结. 堆区分析: 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回 就下面的程序: #inc ...
- C语言进阶之路(一)----C语言的内存四区模型
内存四区模型:操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域:1.栈区:存放局部变量,用完由操作系统自动释放2.堆区:动态分配给程序的内存区域,由程序员手动释放3.数据区: ...
- C语言之内存四区模型和函数调用模型
内存四区模型 流程说明1.操作系统把物理硬盘代码load到内存2.操作系统把c代码分成四个区3.操作系统找到main函数入口执行 1.内存四区: 一个由c/C++编译的程序占用的内存分为以下几个部 ...
随机推荐
- Bootstrap-轮播图-No.2
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- bzoj1797: [Ahoi2009]Mincut 最小割(网络流,缩点)
传送门 首先肯定要跑一个最小割也就是最大流 然后我们把残量网络tarjan,用所有没有满流的边来缩点 一条边如果没有满流,那它就不可能被割了 一条边如果所属的两个强联通分量不同,它就可以被割 一条边如 ...
- CodeForces 839D - Winter is here | Codeforces Round #428 (Div. 2)
赛后听 Forever97 讲的思路,强的一匹- - /* CodeForces 839D - Winter is here [ 数论,容斥 ] | Codeforces Round #428 (Di ...
- Web上传大文件的解决方案
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
- 2019CCPC秦皇岛自我反省&部分题解
练了一年半了,第一次打CCPC,险些把队友坑了打铁,最后也是3题危险捡了块铜. 非常水的点双连通,我居然不相信自己去相信板子,唉,结果整来整去,本来半个小时能出的题,整到了3个小时,大失误呀,不然就可 ...
- Centos 7 搭建蓝鲸V4.1.16稳定社区版
在本地用VMware模拟了三台主机 准备至少3台 CentOS 7 以上操作系统的机器,保证三台虚拟机都可以上网 最低配置:2核4G(我用的是这个) 建议配置: 4核12G 以上 192.168.16 ...
- Python之python简介
一.Python的优缺点 优点: 1.Python的定位是“优雅”.“明确”.“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非 ...
- ThinkPHP空操作与命名空间
命名空间:相当于一个虚拟的目录 正常管理文件使用文件夹--物理区分 TP框架的初始命名空间是:ThinkPHP\Library 在TP框架下命名空间里面使用\代表的是初始命名空间(ThinkPHP\L ...
- Fast R-CNN论文阅读摘要
论文链接: https://arxiv.org/pdf/1504.08083.pdf 代码下载: https://github.com/rbgirshick/fast-rcnn Abstract Co ...
- Kbengine游戏引擎-【1】kbengine安装
本文主要介绍如何在Linux上安装 官网环境要求:Centos >= 5.x, Debian >= 5.x GCC版本: >= 4.4.x 官网链接 本文的安装环境介绍:Centos ...