malloc分配的内存地址为什么不连续?

strongerHuang 2020-07-11 00:00
关注、星标公众,不错过精彩内容

作者:李逍遥
来源:技术让梦想更伟大

我们在写程序中经常会用到malloc函数进行动态内存分配,但是我们有没有想过,在C语言中,向操作系统请求malloc内存空间的地址是连续的吗?

测试

本文使用win7 + 32位操作系统,下面我们从不同申请的方式来测,从而看看申请的是否连续地址。

每次申请一块内存空间

#include "stdio.h"
#include "stdlib.h" 

int main()
{
 
 void *addr0 = malloc(0);
 void *addr1 = malloc(1);
 void *addr2 = malloc(2);
 printf("%p\n",addr0 );

 printf("%p\n", addr1);
 printf("%p\n", addr2);

 printf("%ld\n", addr1 - addr0);
 printf("%ld\n", addr2 - addr1);
 free(addr0);
 free(addr1);
 free(addr2);
 
 return 0;
}

测试结果如下

感觉像是有个固定的间隔,这里测试结果间隔是0x20,但地址并不是连续地址,具体为什么后面我们会讲到。

用数组一次malloc 分配多个虚拟地址

#include "stdio.h"
#include "stdlib.h" 

int main()
{
  int* p;
 int i;
  p = (int *)malloc(10*sizeof(int));

 for (i = 0; i < 10; i++)
 {
  p[i] = i;
   printf("%d----%p\n", p[i],&p[i]);
 }

  getchar();
 
 return 0;
}

结果如下:

可以看出,用一次malloc申请多个(数组)地址的是连续地址 ,结果也应证了。

多次malloc 申请空间是否连续的呢?

#include "stdio.h"
#include "stdlib.h" 

int main()
{
 
  int* p;
  int i;
 
 for (i = 0; i < 1000; i++)//10、100、1000测试
 {
  p = (int*)malloc(sizeof(int));
   *p = i;

   printf("%d-----%p----%p\n", *p, p, p-1);
  }
 
  getchar();
 
 return 0;
}

循环10次结果如下

循环100次结果如下

循环1000次结果如下

测试结果

  1. 我们用一次malloc申请多个(数组)地址的是连续地址 。
  2. 多次malloc 申请地址,通过对每一次申请的内存空间地址和上一块地址  (p-1)作比较发现,地址并不是连续的。
  3. 系统在每次malloc时,从相隔固定长度起开始分配。

为什么呢?

其实这就是内存边界对齐的问题,使用malloc分配的内存空间在虚拟地址空间上是连续的,但是转换到物理内存空间上有可能是不连续的,

对用户而言,所有内存都是虚拟的,程序并不是直接运行在物理内存上,而是运行在虚拟内存上,然后由虚拟内存转换到物理内存。

虚拟内存地址到物理内存地址进行转换时,因为有可能相邻的两个字节是在不同的物理分页上,所以不一定是连续的。

推荐阅读:
代码对齐使用Tab?还是空格?
的区别?" tab="innerlink" data-linktype="2" rel="nofollow">#include使用“”和<>的区别?
手把手教你用铁丝做Arduino UNO板

关注 微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。


长按前往图中包含的公众号关注

strongerHuang 作者黄工,高级嵌入式软件工程师,分享嵌入式软硬件、物联网、单片机、开发工具、电子等内容。
评论 (0)
  • 直流电机是现代社会中无处不在的动力装置,但它们也不是永远运转的机器。让我们一起来了解一下,为什么直流电机会失效,以及我们可以采取哪些措施来延长它们的寿命。  1. 人为因素的影响: 操作失误是直流电机失效的一个重要因素。粗暴地操控电机,比如不小心让它掉落或者使用不当,都可能导致内部零件的损坏,从而使电机无法正常工作。此外,静电放电也是一个需要重视的问题,特别是对于无刷电机而言。静电放电可能会损坏电机内部的传感器,进而影响其控制与反馈系统。 2. 环境因素的考量: 环境条件对直流电
    艾迈斯电子 2024-03-16 11:29 75浏览
  • 来源:虹科汽车电子 虹科技术 | PCAN View功能细讲:从实时监测到错误帧分析原文链接:https://mp.weixin.qq.com/s/yOonZ5NqSCnKjURr9hNC6A欢迎关注虹科,为您提供最新资讯!#PCAN #CAN总线 #工业通讯导读相信使用过PCAN工具的朋友都知道虹科PCAN-View这款免费软件,它具有直观的用户界面,可以实时监测和分析CAN总线上的数据帧,并提供过滤、发送和报文记录。但你知道吗?它其实不只是简单收发报文,虹科PCAN-View还能自动检测和报
    虹科电子科技 2024-03-18 15:48 95浏览
  • 导读:相信使用过PCAN工具的朋友都知道虹科PCAN-View这款免费软件,它具有直观的用户界面,可以实时监测和分析CAN总线上的数据帧,并提供过滤、发送和报文记录。但你知道吗?它其实不只是简单收发报文,虹科PCAN-View还能自动检测和报告CAN总线上的错误帧,帮助用户快速发现和解决通信问题。无论是在汽车、工业自动化还是嵌入式系统领域, 虹科PCAN-View都是一个功能丰富且广泛应用的工具,为用户优化CAN总线系统的性能和提升通信的可靠性提供了极大的帮助。本文带你一起走进这些功能细节,深入
    虹科汽车智能互联 2024-03-18 13:54 111浏览
  • 使美国在21世纪保持安全,美国防部发布最新投资战略,12项领先发展科技,两项是传感器技术!近日(3月8日),美国国防部官网公布了《2024财年投资战略》(INVESTMENT STRATEGY FOR THE OFFICE OF STRATEGIC CAPITAL),确定了战略资本办公室(OSC)重点关注的优先关键组件技术行业投资战略,这是美国最新重量级投资计划。2022 年 12 月,美国国防部长劳埃德·奥斯汀三世 (Lloyd J. Austin III) 启动了战略资本办公室 (OSC),
    传感器专家网 2024-03-18 19:31 50浏览
  • 电脑上的很多东西都是赚钱的手段,知道了就轻松自在。如果你在Win10、11等安装应用程序,出现:应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe工具。你各种删除再安装,清理注册表,各种残留清理,各种模块开关设置、甚至重装系统,都不行,你可以考虑安装一下:通过微软网站:Microsoft visual C++ 2005Microsoft visual C++ 2008因为微软自带系统没有这两个基础程序,旧的应用程序多数要用的
    老黄姓黄 2024-03-17 15:59 184浏览
  • RD-03E_V1.0的使用手册包含设备的基本功能、硬件规格、软件配置和安装条件等详细信息。以下是一些可能包含在手册中的关键信息:基本功能:介绍RD-03E的主要功能和技术特点,例如精准测距或手势识别能力。硬件规格:提供RD-03E模块的详细硬件参数,包括尺寸、接口类型、电气特性等。软件配置:说明如何进行软件设置,包括固件升级、参数调整等操作指南。安装条件:描述模块的工作环境要求,如温度范围、湿度限制等。烧录说明:指导如何使用支持的工具(如keil 5 IDE)和烧录器(如CMSIS-DAP、J
    丙丁先生 2024-03-16 12:54 76浏览
  • 艾迈斯欧司朗全新“样片申请”小程序,逾160种LED、传感器、多芯片组合等产品样片一触即达。轻松3步完成申请,境内免费包邮到家!本期推荐艾迈斯欧司朗首款支持UV-A辐射、环境光闪烁检测功能的微型环境光传感器TSL2585。TSL2585尺寸小巧,采用L2.0mm xW1.0mm xH0.35mm 6引脚OLGA超薄封装,非常适用于可穿戴设备以及手机等这类产品尺寸和厚度受到限制的应用。基于先进的干涉滤光技术,TSL2585的每一个感光像素上都精确沉积了特定光学设计的滤光膜,整体约5µm厚,由60多
    艾迈斯欧司朗 2024-03-18 18:35 94浏览
  • 本书涵盖了边缘计算的各个方面,通过这本书可以对边缘计算有比较全面的认识。书中从边缘计算的发展历史到边缘计算的硬件,存储,通信,安全性,架构,数据处理,开源框架等方面概括性的介绍了边缘计算各个方面涉及的内容。由于本人是通信运营商的一线网络员工,所以对书中的通信内容比较感兴趣,大致介绍一下书中相关内容。翻译搜索复制5G的发展无疑促进了边缘计算的应用,5G设计之初其实就是为万物互联而生的,只不过现阶段的大部分的用户只能感受到其中的一个业务场景——eMBB,eMBB为增强移动宽带,对应的是要求高速,大带
    lospring3 2024-03-16 11:10 109浏览
  • 导读:网关设备是确保数据流畅通信的关键。虹科PCAN系列网关凭借卓越性能和创新技术,为众多应用提供了高效稳定的解决方案。本文将深入探讨虹科PCAN系列网关内部存储空间,特别是EEPROM和SPI Flash的配置与利用,并解析如何通过C编程实现快速实时的信号存读。通过虹科PCAN-Router FD的实例,我们将展示这些存储空间如何助力网关设备在复杂环境中保持卓越性能。一、网关内部存储空间概览网关的内部存储空间经过精心设计,旨在满足快速、稳定的数据处理需求。除了常规的RAM外,虹科PCAN系列网
    虹科汽车智能互联 2024-03-18 13:56 90浏览
  • 1. 整流桥功能介绍整流桥在电子领域中扮演着至关重要的角色,为各种电子设备和电路提供了稳定的电源。整流桥的主要作用是将交流电信号转换为直流电信号。当交流电信号通过整流桥时,它会使得只有一个方向的电流能够通过,从而实现了将交流电信号转换为单向的直流电信号。在一些手持设备需要小巧轻便的整流桥来将交流电转换为直流电。医疗器械:一些便携式医疗器械或医疗监测设备,由于需要经常携带和移动,通常采用小体积的整流桥设计。智能家居产品:如智能插座、智能灯具等,由于需要集成在家居环境中,因此需要小体积的整流桥来满足
    上海雷卯电子 2024-03-16 14:07 103浏览
  • 安装Ubuntu后,可能会影响到Windows 10的启动方式,特别是在使用双系统引导时。这可能是导致您无法通过按F8进入安全模式的原因。以下是一些可能的原因和解决方法:启动管理器更改:安装Ubuntu后,GRUB或其他启动管理器可能成为默认的启动引导程序。这些启动管理器可能不会像Windows那样响应F8键进入安全模式的指令。快速启动功能:Windows 10的“快速启动”功能可能会影响您进入安全模式的能力。当启用快速启动时,系统会跳过某些启动步骤,这可能会阻止您通过F8进入安全模式。系统文件
    丙丁先生 2024-03-19 08:54 35浏览
  • 汽车氛围灯,顾名思义,是烘托车内氛围的照明灯,是汽车内饰情感化设计的一种体现。 一般有暖色(红色等)和冷色系(蓝色、紫色等)两种,在夜晚开启后绚丽浪漫,可营造车内情调,使得旅途并不是那么的枯燥无味,让人们拥有独特的驾驶体验。关于汽车氛围灯浪涌保护上海雷卯EMC小哥分析难点有以下几个方面:1. 复杂的电气环境:汽车的电气系统较为复杂,存在各种干扰源,如点火系统、电机、电子设备等,这可能会对氛围灯的浪涌保护造成挑战。2. 电压波动:汽车运行过程中,电源电压可能会出现较大的波动,例如启动引擎或电器设备
    上海雷卯电子 2024-03-16 13:51 82浏览
  • 总结:科普量子计算机的水书。至少第一章是在科普量子计算机。唯一有点用的就是我上面这一张照片里面的笔记。上面说了为什么量子计算机会比传统计算机运算速度快的原因:因为传统计算机一位只能有一个数字,但是量子计算机可以0和1叠加起来显示。这样就造成了传统计算机需要运行很多遍的东西,而量子计算机不管多少多难都只用计算一次。(前提是量子比特位够长)---------------------------------------------------------------------------------
    youyeye 2024-03-17 17:04 132浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦