当未进行 4 字节对齐时,Monotouch 浮点指针会抛出 NullReferenceException

2024-03-26

我面临着一个我无法理解的问题。

在使用 Monotouch 在 C# 中使用不安全指针时,我在设备 (ARM) 上收到 NullReferenceException,但我无法解释原因,让我们看一些代码

var rand = new Random();
var buffer = new byte[2 * 1024 * 1024];
rand.NextBytes(buffer);

fixed (byte* ptr = buffer) {
    var ptr2 = ptr + 982515;

    //This works
    var bfr = new byte[8];
    for (int i = 0; i < 8; i++)
        bfr[i] = ptr2[i];
    var v = BitConverter.ToDouble(bfr, 0);

    //This throws a NullReferenceException on device
    var v2 = *(double*)ptr2;

    Console.WriteLine("v: {0}; v2: {1}", v, v2);
}

它只会在设备上崩溃。 与 ARM 结构化对齐有什么关系吗?

Edit

经过一番研究后,我得出以下结论:

浮点值只能从 ARM 上的 4 字节对齐地址读取

static void Main(string[] args) {
    Test(982512); //Works
    Test(982516); //Works
    Test(982515); //Crash on device only
}

unsafe static void Test(int offset) {
    var rand = new Random();
    var buffer = new byte[2 * 1024 * 1024];
    rand.NextBytes(buffer);

    fixed (byte* ptr = buffer) {
        var ptr2 = ptr + offset;

        //Always works
        var bfr = new byte[8];
        for (int i = 0; i < 8; i++)
            bfr[i] = ptr2[i];
        var v = BitConverter.ToDouble(bfr, 0);

        //Throws a NullReferenceException on device if offset is not 4-byte aligned
        var v2 = *(double*)ptr2;

        Console.WriteLine("v: {0}; v2: {1}", v, v2);
    }
}

关于如何绕过这个的想法吗?


在 ARM 设备上,只能在 4 字节对齐的地址处取消引用浮点值(单精度、双精度)。

http://www.aleph1.co.uk/chapter-10-arm-structed-alignment-faq http://www.aleph1.co.uk/chapter-10-arm-structured-alignment-faq

所以解决方案是这样的:

static double ReadDouble(byte* ptr, int offset) {
    var ptr2 = ptr + offset;
    if ((int)ptr2 % 4 == 0)
        return *(double*)ptr2;
    else {
        var bfr = new byte[8];
        for (int i = 0; i < 8; i++)
            bfr[i] = ptr2[i];
        var v = BitConverter.ToDouble(bfr, 0);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当未进行 4 字节对齐时,Monotouch 浮点指针会抛出 NullReferenceException 的相关文章

  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 选择列表逻辑应位于 ASP.NET MVC、视图、模型或控制器中的什么位置?

    我觉得我的问题与这个问题很接近 但我想对这样的代码应该放在哪里进行更一般的讨论 Asp Net MVC SelectList 重构问题 https stackoverflow com questions 2149855 asp net mv
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • GoogleSignIn ios 附加到谷歌表格

    我目前正在开发一个 iOS 应用程序 该应用程序需要写入登录用户拥有的 Google 工作表 要登录我正在使用的用户GoogleSignInpod 并附加到我正在使用的谷歌表GoogleAPIClientForREST Sheets pod
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题

随机推荐

  • 标签发布

    是否可以仅从 a 标签 我知道锚标记通常仅用于 GET 并且我知道我可以使用 javascript 来执行此操作 例如JavaScript post 请求就像表单提交 https stackoverflow com questions 13
  • opencv错误:输入参数的大小不匹配

    我正在使用金字塔进行图像混合 我收到 opencv 错误 我正在关注官方 opencv 教程 http docs opencv org 3 0 beta doc py tutorials py tutorials html http doc
  • 确认()对话框中是/否按钮而不是确定/取消?

    In an Adobe AIR HTML JS app is it possible to display Yes No buttons instead of OK Cancel in a confirm dialog 任何可以与webki
  • Android:从HOME重新启动后保留任务的活动堆栈

    我的应用程序有两项活动 我按以下顺序开始 HOME gt A gt B 现在我按 HOME 并再次启动 A 我希望在 A 顶部看到活动 B 但我得到的是 A 因此活动堆栈被清除 显现
  • 如何使用 JavaScript / Tone.js 更改音调和播放速率?

    我想同时完成两件事 1 改变播放速率声音文件的速度为 1 2 2 降低pitch五分之一 最后 我不想使用单独的按钮来播放结果将其连接到音频标签并使用那里的播放按钮 下面是我迄今为止使用 Tone js 得到的最接近的结果 我真的很难处理文
  • 使用 jQuery 创建 HTML 元素最有效的方法是什么?

    最近我做了很多模态窗口弹出窗口之类的事情 我使用了 jQuery 我用来在页面上创建新元素的方法绝大多数是沿着以下路线 div div 但是 我感觉这不是最好或最有效的方法 从性能角度来看 在 jQuery 中创建元素的最佳方法是什么 这个
  • 具有位字段的结构中的偏移量

    如果我们有一个带有位字段的结构体 那么结构体中的后续成员如何对齐 考虑以下代码 struct A int a 1 char b at offset 1 struct B int a 16 int b 17 char c at offset
  • 如何从当前文件夹旁边的文件夹导入模块?

    我已经检查了尽可能多的页面 并尝试了我找到的所有内容 但没有一个成功 我还检查了有关导入的 PEP 页面并尝试了每个示例 但没有一个起作用 我有一个包含单元测试的测试文件夹 我需要导入我想要测试的模块 这些模块位于 src 文件夹旁边的名为
  • 子类化 datetime.timedelta 时出现奇怪的行为

    为了方便起见 我想创建 datetime timedelta 的子类 这个想法是这样定义一个类 class Hours datetime timedelta def init self hours super Hours self init
  • 如何将 SQLite 与 AngularJS 集成?

    我正在使用 google 地图 api v3 和一个名为 ng map 的插件制作一个 angularjs 应用程序 但我想将一些坐标存储在 SQLite 数据库中 然后从应用程序中检索 基本上 你不能 但是 如果您正在开发混合移动应用程序
  • MySQL 中的 CASE 性能?

    我想知道是否在 MySQL 查询中使用 CASE WHEN THEN 表达式对性能有负面影响吗 而不是使用 CASE 表达式 例如在 UPDATE 查询中 你总是有可能在你的程序中做出 if else 语句用 php python perl
  • ARM 汇编不能同时使用立即值和 ADDS/ADCS

    我目前正在尝试使用汇编来加速 Cortex M0 Freescale KL25Z 上的一些 C 函数 我遇到这个最小测试程序的问题 syntax unified cpu cortex m0 text global test code 16
  • 有没有办法在 Shiny 中构建时显示绘图,而不是等待所有绘图?

    我有一个闪亮的仪表板 里面有很多图 所有这些都需要几秒钟的时间来构建 一旦最后一个构建完成 它们就会全部显示 我希望每个图在完成后立即显示 我知道 R 是单线程的 但似乎必须有一种方法 将执行返回到显示代码 或类似的东西 这段代码演示了这个
  • tr1::function 可以吞掉返回值吗?

    boost 函数常见问题解答第 3 项 http www boost org doc libs 1 46 1 doc html function faq html具体解决了我感兴趣的场景 为什么有 void 的解决方法 回报 C 允许它们
  • 什么是 JavaScript 的服务器端渲染?

    一些 JavaScript 框架 例如 Dust js 声称它们还支持服务器端渲染 除了客户端渲染之外 有人可以解释这是如何工作的吗 我的理解是JS总是在浏览器运行时执行 JavaScript 可以使用以下系统在服务器上运行Node js
  • setInterval() 对性能有害吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Leaflet图层控制:选择图层组内的图层?

    我想要一个传单图层控件 我可以在其中选择一个基础图层 并使该基础图层本身成为一个图层组 我可以从中选择要显示的子图层 我正在考虑一种设置 在其中单击单选按钮来选择基础图层 图层组 然后在其下方我会看到一个复选框列表 用于显示其中的哪些图层
  • vb.net 复选框标签位置

    有没有办法将复选框放在 asp 复选框标签的右侧 默认情况下 此代码放置复选框 然后放置标签
  • java中静态变量的初始化

    静态变量在类加载时初始化 到底是什么意思 我在网上阅读了很多讨论 但仍然感到困惑 第 2 步是初始化步骤 对吗 那么第 1 步 加载类时 会发生什么 public class NewClass static int arr Step 1 N
  • 当未进行 4 字节对齐时,Monotouch 浮点指针会抛出 NullReferenceException

    我面临着一个我无法理解的问题 在使用 Monotouch 在 C 中使用不安全指针时 我在设备 ARM 上收到 NullReferenceException 但我无法解释原因 让我们看一些代码 var rand new Random var