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

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. Python习题集(一)

    每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! 题目 有一个数据list of dict如下 a = [ {"}, {"}, {"}, ] 写入到本 ...

  2. 【Weiss】【第03章】练习3.16:删除相同元素

    [练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...

  3. shell脚本基础-起始句的含义

    大部分的shell脚本第一行,要么是 #!/bin/bash 要么是 #!/bin/sh 其实第二种是第一种的升级版,增加了协议posix(#!/bin/sh = #!/bin/bash + posi ...

  4. XML的概述,.Dom4解析和SAX解析

    1.什么是XML XML 指可扩展标记语言(EXtensible Markup Language) html(hyper text markup langauge) XML 是一种标记语言,很类似 H ...

  5. centos7 LVM扩容案例

    测试数据 cd / && dd if=/dev/zero of=file bs=1M count=10000 将磁盘变大的测试命令. 生产环境不要用. 这只是用于测试扩容后的效果 LV ...

  6. java物流查询接口测试代码-快递100

    测试代码 返回json格式,xml/html格式自行修改参数 import java.io.IOException; import java.io.InputStream; import java.n ...

  7. effective-java学习笔记---优先使用泛型方法30

    泛型类型比需要在客户端代码中强制转换的类型更安全,更易于使用. 当你设计新的类型时,确保它们可以在没有这种强制转换的情况下使用. 这通常意味着使类型泛型化. 如果你有任何现有的类型,应该是泛型的但实际 ...

  8. Hive学习笔记六

    目录 查询 一.基本查询 1.全表和特定列查询 2.列别名 3.算术运算符 4.常用函数 5.Limit语句 二.Where语句 1.比较运算符(Between/In/ Is Null) 2.Like ...

  9. 维护你的请求队列,处理token异常

    前言 网络请求是开发中最基础也是最核心的需求,封装一个稳定且可用性高的请求也显得尤为重要.通常封装的内容除了入参之外,更多的是请求中的异常处理.本文分享下我在处理 token 异常方面的做法,通过维护 ...

  10. Mac下安装安装selenium与安装chromedriver安装

    开发环境:MacOS,Python3.7 1. 安装selenium 可以使用pip安装(pip install selenium)或者使用pycharm进行安装下载 2. 运行如下代码: from ...