众所周知,堆和栈是数据结构中的两种数据结构类型,堆是一种具有优先顺序的完全二叉树(或者说是一种优先队列,因为它在一定的优先顺序下满足队列先进先出的特点),排队打饭就是它的典型实例,栈是一种后进先出的数据结构,串糖葫芦和吃糖葫芦完美的诠释了栈的本质。但本文想要说的并不是这种堆和栈,而是内存中的

C/C++ 之所以屹立不倒,是因为它可以接触系统底层,可以访问内存就是其中的一个重要标志。这种得天独厚的优势是其它语言所望尘莫及的。

内存中的堆和栈是不同于数据结构中的堆和栈的,内存中的栈区处于相对较高的地址,以地址的增长方向为上的话,栈地址是向下增长的。这是计算机中的堆栈分配图解:

程序员所定义的局部变量都在栈区,自由申请的内存空间都在堆区,常量和全局变量都在静态区。对一个程序员来说栈区是最方便的,堆区是最自由的,因为程序员在堆区可以自由分配内存空间。下面用实例说明:

这里的data变量是被分配在栈区的,因为它是局部变量,并且是系统自动分配的,Int类型默认4个字节。

这里的info和data变量是被放在堆区的,但是这里程序员并没有利用malloc函数动态为他分配指定内存

所以依然占用默认int类型默认空间-4个字节。

这里的data变量是被放在堆区的,而且程序员利用malloc函数动态为它分配了100字节大小的空间,后面也用_msize()函数验证了这一点。有的人可能对malloc函数的使用方法不太清楚,这里给解释一下:

因为malloc函数返回的是一个void*指针变量,而C/C++规定,void*指针变量可以强制转换为其他任意指针类型,故有了以上的写法。

再给大家看一个程序

第一行输出的是一个地址,因为malloc函数返回的是void类型的指针变量

第二行输出的是8,因为我的机子是64位的,在64位系统中,指针变量所占用的内存为8个字节

第三行输出的是4,因为int类型指针指向的一定是int类型变量,而int类型变量所占用的内存为4个字节,需要注意的是,sizeof(任意类型指针变量)所求出的并不是你定义的变量所占用的内存大小,而是和该指针同类型的变量所占用的内存大小。

第四行输出的是100,这或许就是你第三行的疑惑------你定义的变量所占用的内存大小!!!,你们一定要记注这个函数哟,它叫_msize,在<malloc.h>头文件中。

C/C++内存详解的更多相关文章

  1. Java中堆内存和栈内存详解2

    Java中堆内存和栈内存详解   Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...

  2. Linux内存详解

    --Linux内存详解 -----------------2014/05/24 Linux的内存上表现的不像windows那么直观,本文准备详细的介绍一下Linux的内存. 请看这下有linux命令f ...

  3. JVM内存详解-阅读笔记

  4. Oracle内存详解之 Library cache 库缓冲

    Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...

  5. DDR3内存详解,存储器结构+时序+初始化过程

    DDR3内存详解,存储器结构+时序+初始化过程 标签: DDR3存储器博客 2017-06-17 16:10 1943人阅读 评论(1) 收藏 举报  分类: 硬件开发基础(2)  转自:http:/ ...

  6. NAND_FLASH_内存详解与读写寻址方式

    一.内存详解 NAND闪存阵列分为一系列128kB的区块(block),这些区块是 NAND器件中最小的可擦除实体.擦除一个区块就是把所有的位(bit)设置为"1"(而所有字节(b ...

  7. JavaScript 内存详解 & 分析指南

    前言 JavaScript 诞生于 1995 年,最初被设计用于网页内的表单验证. 这些年来 JavaScript 成长飞速,生态圈日益壮大,成为了最受程序员欢迎的开发语言之一.并且现在的 JavaS ...

  8. HDFS NameNode内存详解

    前言 <HDFS NameNode内存全景>中,我们从NameNode内部数据结构的视角,对它的内存全景及几个关键数据结构进行了简单解读,并结合实际场景介绍了NameNode可能遇到的问题 ...

  9. Linux 共享内存详解一

    共享内存段被多个进程附加的时候,如果不是所有进程都已经调用shmdt,那么删除该共享内存段时,会出现一个临时的不完整的共享内存段(key值是0),无法彻底删除.只有当所有进程都调用shmdt,这个临时 ...

  10. Java中堆内存和栈内存详解

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

随机推荐

  1. dict的常用方法

    注:dic表示定义的一个字典变量,如:dic = {'name': 'shawn', 'age': 18} 增: 1.  dic['love'] = 'girl'  直接通过新的键值对进行添加 dic ...

  2. Fluent算例精选|03利用VOF和蒸发-冷凝模型

    通过学习本算例您将获得? 1.学会基本的VOF模型设置流程 2.学会利用蒸发-冷凝模型来模拟传热沸腾 目录 1摘要4 2传热沸腾模型介绍4 3前处理4 4求解设置5 4.1启动Fluent5 4.2网 ...

  3. scrapy框架Request函数callback参数为什么是self.parse而不是self.parse( )

    加括号是调用函数,不加括号是指的是函数地址,此处只需要传入函数的地址,等待程序到时调用即可

  4. Untargeted lipidomics reveals specific lipid abnormality in nonfunctioning human pituitary adenomas 非靶向脂质组学揭示非功能人类脑垂体瘤中的特异性脂质 (解读人:胡丹丹)

    文献名:Untargeted lipidomics reveals specific lipid abnormality in nonfunctioning human pituitary adeno ...

  5. 欢乐水杯(happy glass)中流体的一种实现!图文视频讲解 ! Cocos Creator!

    使用cocos creator v2.2.2 实现流体效果 ! 图文+视频讲解! 效果预览 实现原理 整体思路是参考论坛中的一个帖子 这款游戏中水的粘连效果在Construct3中利用图层很容易实现, ...

  6. 解析“60k”大佬的19道C#面试题(上)

    解析"60k"大佬的19道C#面试题(上) 先略看题目: 请简述async函数的编译方式 请简述Task状态机的实现和工作机制 请简述await的作用和原理,并说明和GetResu ...

  7. Prism 源码解读2-View的加载和控制

    介绍 上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制. 4.ViewDiscovery 在创建好Region后需要将View添加到Region中. ...

  8. [树的深度] Party

    Party A company has n employees numbered from 1 to n. Each employee either has no immediate manager ...

  9. 在Ubuntu中安装OpenCV-Python | 三

    在本教程中,我们将学习在Ubuntu System中设置OpenCV-Python.以下步骤针对Ubuntu 16.04和18.04(均为64位)进行了测试. 可以通过两种方式在Ubuntu中安装Op ...

  10. 知识图谱与机器学习 | KG入门 -- Part1-b 图深度学习

    介绍 我们正在定义一种新的机器学习方法,专注于一种新的范式 -- Data Fabric. 在上一篇文章中,我们对机器学习给出了新的定义: 机器学习是一种自动发现Data Fabric中隐藏的&quo ...