访问非法内存为什么不会出错?

article/2025/9/24 2:07:47

大家好,我是杂烩君。

上篇文章分享几个实用的代码片段(第二弹)我们分享了一段代码:

321666bfe111b49caa0807e3e71246c7.png

有位读者在朋友圈评论我的文章:(type * )0不是指向空地址吗?(type*)0->member不是访问非法内存了吗?为什么不会出错?

83d076a7cba6967061bfb75d2f6f3045.png

这篇文章我们就来解释这个问题。

GET_MEMBER_SIZE分析

首先,先来解释 获取结构体成员大小 这个宏定义:

// 获取结构体成员大小
#define  GET_MEMBER_SIZE(type, member)   sizeof(((type*)0)->member)

虽然说这里用了 ((type*)0)->member ,看起来似乎有问题?访问非法地址0地址?

其实不是的,注意这里用到了 sizeof操作符 。在C语言中,sizeof() 是一种内存容量度量函数,其字节数的计算是在 编译阶段 进行的。

C语言源程序经过编译器进行词法分析、语法分析等过程生成中间语言(object后缀的文件)编译期间会生成一个字符表和静态分配空间(如new static 全局变量)它们所需的内存空间可以计算出来放在链接库后的可执行文件中(虚拟内存即磁盘),在运行时将放在可执行文件中的偏移量加载到内存的堆中同时将局部变量加载到栈中。

所有内存的开辟只有程序运行的时候才会在物理内存中开辟,即sizeof(((type*)0)->member)的操作不是等到程序运行期间计算的,而是在编译阶段就计算了,所以GET_MEMBER_SIZE宏定义并没有访问非法内存的操作。

进一步的,我们看看上面那个代码实例中,结构体成员的字节数是不是在编译阶段计算出的,编译出汇编文件:

gcc -S member_size.c -o member_size.s
6dd59a1f855f9315ac895d22e6867764.png

这个汇编文件我们可能不全看懂所有指令,但大概知道如下三个指令的意思我们就大概可以知道这段汇编代码的意思了。

  • leaq:加载有效地址指令,即将有效地址复制到寄存器中。

  • movl:数据传送指令。

  • call指令:将当前的 IP 或 CS和IP 压入栈中, 转移(jmp)。

可以看到,从上到下,依次会把立即数1、1、2、4、3、12放到esi寄存器中。

为什么是这些立即数?

我们编译运行一下我们的程序:

9c5c02b0ff6997326e48d054b945a117.png

可以看到,正好就是我们需要求的结构体各成员的大小及结构体的大小,所以GET_MEMBER_SIZE(type, member)是在编译阶段起作用的。

其实,GET_MEMBER_SIZE宏定义中的0只是看做一个随意给的地址,方便求成员的大小,如果写为0容易引起误解,不妨可以写为一个任意值,比如修改为100,也是可以计算出各结构体成员的大小的。

63642b5da9d65756d18681b39af443ef.png cf7fbf34959bff79a4c08692291692a4.png

最后,如果 ((type*)0)->member 在其它地方使用,会出现什么问题呢?自然就是这位读者所理解的:操作非法地址。会引起段错误。比如添加如下一行代码:

451d2261e92e4b64c866d699e0da8820.png

编译运行:

7798180460eef81411c73e61afe08bf2.png

段错误的定位方法可查阅往期文章:分享一种你可能不知道的bug定位方法、嵌入式段错误的3种调试方法汇总!

GET_MEMBER_OFFSET分析

// 获取结构体成员偏移量
#define  GET_MEMBER_OFFSET(type, member)  ((size_t)(&(((type*)0)->member)))

该宏返回的是以0地址为基准的地址,也不涉及访问0地址的操作。

88ea3acab7cb209946a3f33134aa0e09.png

以上就是本次的分享。

期待你的三连支持!


http://chatgpt.dhexx.cn/article/DMJFCTA6.shtml

相关文章

关于ImportError: DLL load failed: 内存位置访问无效的解决方案

一、首先确定import XXX哪个出错了。我的是import ibm_db出错了! 二、cmd,输入 pip uninstall ibm_db,先是删除这个驱动包!前提是你必须安装pip,如果没有安装命令不能识别。 三、删除成功后,输入 pip ins…

MUI框架详解-全面讲解MUI框架使用

课程目录: 01MUI 介绍、新项目创建、 基础布局.mp4 02MUI - accordion(折叠面板)、button.mp4 03MUI - actionsheet(操作表)、badge.mp4 04MUI - 复选框、单选框、使用js获取选择值.mp4 05MUI - datepicker&#xff08…

腾讯开源的Android UI框架——QMUI Android

各位同学,早上好,我是你们的老朋友D_clock爱吃葱花,前些天忙着发版本,最近也在看各种各样的新知识,有好多东西想写啊啊啊啊啊。嗯,先冷静捋一下,卖个关子。扯回正题,今天继续为大家推…

vue开发移动端,mui框架的各种使用方法

前面提到使用vue开发APP,自己不太熟悉,后来了解到有这个mui框架,然后改变状态栏颜色和监听返回键也是使用的这个框架,后来又遇到了一些问题,但是官网没有写操作方法(也许是没找到),后…

Android原生集成MUI框架进行混合开发

开发APP中我们经常进行原生结合H5进行混合开发,下面将进行详细讲解Android原生集成MUI框架进行混合开发(项目Demo如下,有需要的可以下载查看),下一篇讲述,Android原生和MUI(也适合H5与原生交互&…

MUI 前端框架体验

前端框架有很多&#xff0c;在做混合开发APP 时&#xff0c;MUI 的UI 看起来更像原生APP&#xff0c;所以就选择MUI 来体验一下。 1 首先下载 安装 HBuilder X 2 创建并选择5app 项目 3.比较关键的index页面 Markup <!DOCTYPE html> <html> <head><me…

Android引入QMUI框架

前言 作为一个JAVA后端开发&#xff0c;学习Android开发&#xff0c;Android原生UI控件样式单一&#xff0c;简单&#xff0c;下面考虑引入UI框架QMUI。具体步骤如下&#xff1a; 一、创建一个Empty项目 二、打开QMUI官网查看相关步骤(对新手很不友好) https://qmuiteam.com…

vue框架和uniapp框架区别,前端vue和uniapp哪个好用

uniapp和vue有什么区别&#xff1f; vue和uni-app的区别如下&#xff1a;1、uni-app可以通过打包实现一套代码多端运行&#xff0c;而vue不行。2、uni-app有自动的框架预载&#xff0c;加载页面的速度更快&#xff0c;vue没有。 3、uniapp使用小程序的标签&#xff0c;vue使用…

vue介绍及vue与其它框架的优缺点

一.vue介绍 1.什么是vue.js Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有…

MUI框架-05-用MUI做简单App界面

MUI框架-05-用MUI做一个简单App MUI 是一个前端框架&#xff0c;前端框架就像 Bootstrap&#xff0c;EasyUI&#xff0c;Vue ,为了做 app 呢&#xff0c;就有了更加高效的 MUI&#xff0c;我觉得前端框架有很多&#xff0c;也没有必要都取掌握&#xff0c;找一个比较出名的&am…

MUI--高性能前端框架

MUI是什么&#xff1f; 最接近原生APP体验的高性能前端框架。 相比同类框架的优势&#xff1f; 性能和体验的差距&#xff0c;一直是mobile app开发者放弃HTML5的首要原因。 浏览器天生的切页白屏、不忍直视的转页动画、浮动元素的抖动、无法流畅下拉刷新、侧滑抽屉卡顿等问题…

移动端开发框架mui介绍

MUI 官网&#xff1a;https://www.dcloud.io/mui.html MUI 文档&#xff1a;https://dev.dcloud.net.cn/mui/ui/ 演示地址&#xff1a;https://dcloud.io/hellomui/ &#xff08;支持手机和电脑浏览器&#xff09; 开发工具&#xff1a;https://www.dcloud.io/hbuilderx.htm…

MUI(最接近原生APP体验的高性能前端框架)

MUI-最接近原生APP体验的高性能前端框架MUI: 最接近原生APP体验的高性能前端框架https://dev.dcloud.net.cn/mui/ 最接近原生APP体验的高性能前端框架&#xff0c;追求性能体验&#xff0c;是我们开始启动MUI项目的首要目标&#xff0c;轻量必然是重要特征。 MUI不依赖任何第…

关于MUI一个很实用的前端框架

今天也是我接触mui的第一天。首先先上MUI的官网上面瞧一瞧。http://dev.dcloud.net.cn/mui/window/#closewindow我这里上的不是官网&#xff0c; 我是先把他的基本能实现的功能先做了一个简单的了解。下面大家跟着我看&#xff1a; 一、Mui的组件 mui的组件都很原生比如拓展阅读…

MUI框架快速开发

文章目录 创建项目快速编写标题页面主体底部选项卡常用关键词 字体图标事件处理常见手势事件 窗口对象底部选项卡-页面切换底部选项卡窗口对象设置点击事件处理 栅格系统页面传值通过openWindow通过自定义事件 常用关键词参考 创建项目 使用MUI框架搭建项目&#xff0c;首先我…

MUI框架学习——了解MUI

MUI框架-01-介绍-准备-创建项目 从0开始快速高效学习 MUI 框架官方文档&#xff1a;http://dev.dcloud.net.cn/mui/ui/ &#xff08;1&#xff09;MUI 介绍 MUI 是什么&#xff0c;解决了什么问题&#xff1f;MUI 官方号称最接近原生APP体验的高性能前端框架简单的说就是webap…

mui框架

1 MUI介绍 1.1 MUI是什么&#xff0c;解决了什么问题。 &#xff08;1&#xff09;性能和体验的差距&#xff0c;一直是mobile app开发者放弃HTML5的首要原因。 浏览器天生的切页白屏、不忍直视的转页动画、浮动元素的抖动、无法流畅下拉刷新等问题&#xff0c;这些都让HTML5…

MUI框架初级教程

写在前面 本系列文章我们将利用mui基于网易云音乐API实现一个音乐播放器APP&#xff0c;同时基于环形或者融云实现聊天功能。作为本系列文章的第一篇&#xff0c;本文会详细讲解html5中管理应用窗口界面的Webview模块的用法&#xff0c;因为是初级教程篇不过多讲解原理部分&…

MUI框架的基本使用

要使用MUI框架&#xff0c;在Hbuilder中必须新建HTML5 APP&#xff0c;并且创建MUI项目&#xff0c;Hbuilder会自动生成代码 MUI页面的使用&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport&…

MUI框架开发APP详解,一篇就够了

MUI框架开发APP详解&#xff0c;一篇就够了 1.MUI简介2.下载安装hbuilderx3.新建一个5app项目4.制作首页首页头部首页主体 5.制作底部选项卡6.H5plus使用设置页面样式蜂鸣 7.app打包发布基础配置图标配置发行 1.MUI简介 最接近原生APP体验的高性能前端框架 追求性能体验&…