字节指针 NullReferenceException

Byte Pointer NullReferenceException

所以,长话短说,这显然是有效代码。在 Unity3D 中工作 - 在 PC 上运行良好。为 Android- NRE 构建,当尝试访问固定的特定地址时 - NRE 在下面的代码块中注释。

public static unsafe byte[] SerialiseFloat(byte header, float val)
{
    data = new byte[5];
    fixed (byte* b_ptr = data)
    {
        *b_ptr = header;
        *((float*)(b_ptr + 1)) = val; //NRE
        return data;
    }
}

并不是随便,而是因为它似乎出现在每一个关于不安全上下文 C# 的问题中——是的,我需要使用它。不,这对这个实例来说并不重要,我知道在这个例子中不必要使用不安全的上下文(这是来自我的旧序列化库,生成的合同交给这些方法来序列化成员,这只是一个快速放在一起,这些东西需要内联,所以我不使用多个数组。

无论如何,重点是- NRE 在上面评论的那一行。任何人都知道这怎么可能,以及我如何开始修复它?它一直在发生,它被清楚地分配和固定。内存分析表明它被绝对正确地引用,一切都按预期对齐。现在已经转载了大约 15 次。

感谢GSerg for his comment pointing me towards 。我现在知道 ARM 的对齐约束在处理浮点值时会发挥作用。既然我知道原因,我将简单地强制我的结构打包以严格对齐。感谢提醒 - 作为移动开发和 ARM 的新手,我对此一无所知,肯定会失眠,非常感谢我!

编辑:只是更新以确认在 运行 之后一切正常工作,通过一些序列化测试,我的代码生成器现在预处理 Android 上生成的合同以强制浮点字段始终对齐到 4 字节内存地址。