You need to enable JavaScript to run this app. 如何访问ffi返回的指针所指向的结构体数组(ffi-napi场景)
优惠活动
大模型
产品
解决方案
定价
更多

如何访问ffi返回的指针所指向的结构体数组(ffi-napi场景)

问题原因

你的结构体类型定义本身没有语法错误,无法读取后续元素的核心原因是:你定义的els字段为structEl的单指针类型,ffi默认只会将该指针解析为单个结构体实例的地址,直接读取自然只能拿到第一个元素。
C语言中结构体数组本质是连续内存空间存储的同类型结构体,首元素指针和数组指针的类型完全一致,你需要手动按单个结构体的内存大小偏移指针,才能读取到后续的所有元素。

解决方案

如果你使用的是ref-napi+ref-struct-napi组合,可以按如下方式读取完整数组:

// 调用DLL函数拿到返回的structResult实例
const result = yourDllExportFunction()

const elCount = result.number_of_els
const elsBasePtr = result.els
const elSize = structEl.size // 提前获取单个structEl的内存字节大小
const elArray = []

for (let i = 0; i < elCount; i++) {
  // 计算当前索引对应的结构体指针
  const currentPtr = elsBasePtr + i * elSize
  // 将指针转为structEl实例
  const currentEl = structEl.prototype.get(currentPtr)
  elArray.push(currentEl)
}

// elArray即为完整的结构体数组

如果你使用的是旧版ref库,将实例读取逻辑替换为ref.get(currentPtr, 0, structEl)即可。

注意事项
  • 需保证JS侧定义的structEl内存对齐规则和C侧的结构体对齐规则一致,否则structEl.size计算错误会导致指针偏移异常,读取内容乱码。
  • C侧分配的els数组内存不会被JS的GC自动回收,如果你使用完后需要释放内存,必须调用DLL配套提供的内存释放接口手动释放,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 01:30:02