You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JNA Pointer获取内存偏移指针并写入数据?

问题原因分析

你遇到的Invalid memory access错误,核心是误用了Pointer.getPointer(int offset)方法!

这个方法不是用来创建指向原内存偏移位置的指针,而是从当前指针指向的内存的offset位置读取一个指针类型的值,把这个随机的未初始化值当作新的指针地址。因为你刚分配的Memory内存块内容是未定义的随机值,所以getPointer(4)返回的是指向无效内存的指针,调用setInt自然会触发内存访问错误。

正确的解决方案

要获取指向原内存偏移位置的有效指针,应该用Pointer.share(int offset)方法,它会返回一个共享原内存块的新指针,指向原指针偏移offset后的地址:

方法1:使用share创建偏移指针

Pointer pM = new Memory(65536);
// 创建指向pM偏移4字节位置的有效指针
Pointer p = pM.share(4);
pM.setInt(0, 0xFFFF); // 修改原内存0-3字节
p.setInt(0, 0xBBBB);  // 修改原内存4-7字节(和pM.setInt(4, 0xBBBB)效果完全一致)

方法2:直接使用原指针+偏移写入

如果不需要单独的偏移指针,直接在原Memory对象上调用带偏移参数的setInt方法更直接:

Pointer pM = new Memory(65536);
pM.setInt(0, 0xFFFF);  // 写入0偏移位置
pM.setInt(4, 0xBBBB);  // 直接写入4偏移位置,无需额外指针
验证操作是否正确

你可以通过读取原内存的对应偏移位置来确认写入成功:

// 读取原内存4偏移位置的值,预期输出为bbbb
System.out.println(Integer.toHexString(pM.getInt(4)));

内容的提问来源于stack exchange,提问作者p1906

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:55:41