当未进行 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 的相关文章

  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 在故事板中的视图控制器之间滑动手势

    我希望添加左右滑动手势来在视图控制器之间进行更改 这是否可能 并且有没有一种简单的方法可以在故事板中执行此操作 谢谢 故事板允许您在两个视图控制器之间设置 Segues 我想说首先在视图之间附加 Segues 给它一个标识符 然后使用类似的
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • Swift 中的 UIAlert 自动消失?

    我有以下代码 Creates Alerts on screen for user func notifyUser title String message String gt Void let alert UIAlertController
  • IPV6 快速可达性

    我是 swift 和 xcode 的新手 并且我的应用程序因 IPV6 而被拒绝 性能 2 1 当我们执行以下操作时 您的应用程序会在运行 iOS 9 3 5 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃 具体来说 当我们
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a

随机推荐

  • 标签发布

    是否可以仅从 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