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

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. java学习笔记(1)——有关接口

    接口: interface intf0{ public void doSomething(); } interface intf1{ public void doAnything(); } class ...

  2. 在Centos系统中基于PowerDNS和Poweradmin自建域名解析服务器替代DnsPod

    本文讲述了我在Centos 7系统(其他版本的Centos未尝试)中基于PowerDNS和poweradmin自建域名解析服务器替代DnsPod的过程.通过本文所述方法,可以建立权威域名解析服务器的m ...

  3. java-乘法口诀表。(新手)

    //创建的一个包名. package qige; //定义一个类. public class KJ { //公共静态的一个主方法. public static void main(String[] a ...

  4. 网络安全从入门到精通 ( 第二章-5) 后端基础PHP—简介及基本函数-下

    本文内容: 循环语句 PHP获取表单信息 PHP操作Mysql语句 语法SQL注入 1,循环语句: for循环: 语法:for($x=0,$x<10;$x++){执行语句;} 注意:$x++,先 ...

  5. 【JAVA进阶架构师指南】之三:深入了解类加载机制

    前言   在上一篇文章中,我们知道了JVM的内存划分,其中在说到方法区的时候说到方法区中存放的信息包括[已被JVM加载的类信息,常量,静态变量,即时编译的代码等],整个方法区其实就和类加载有关. 类加 ...

  6. SpringMVC框架——文件的上传与下载

    使用SpringMVC框架做个小练习,需求: 1.单个图片上传并显示到页面中: 2.多个图片上传并显示到页面中: 3.上传文件后下载文件: 1.pom.xml中添加依赖 <!-- 文件上传 -- ...

  7. wpf xaml CS0426 错误原因

    wpf  程序集中 类命名空间名称和类名不能相同,否则在 xaml生成 i.g.cs时,会导致 自动生成代码无法推到处是类型还是命名空间的问题.   触发这个错误的条件是类命名空间 与 类名相同 并 ...

  8. vscode回车补全代码

    VsCode设置回车补全代码而不换行 有一部分人不习惯用tab键补全代码,我就是其中之一,习惯了回车补全的我决定设置一波,网上找了很多, 没找到比较详细的,所以自己写一个 有一个叫keybinding ...

  9. C# datagridview 格式化单元格内容

    private void dgvBig_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {  if (dgvB ...

  10. hdu2112 dijkstra

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2112/ 只要需处理一下字符串,给他个编号再跑一半dijkstra就行. 代码如下: #include<bi ...