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

如何调用带输出指针参数的外部函数并获取返回值?(CFFI场景)

调用CFFI定义的do_something函数并获取output值

要调用这个函数并读取输出参数的值,核心是在Lisp中分配一块C语言可访问的int类型内存,将其指针传递给函数,最后从该内存中读取结果。以下是两种常用方法:

方法一:使用with-foreign-object(推荐,自动内存管理)

这个宏会自动帮你分配和释放内存,无需手动管理,避免内存泄漏:

(cffi:with-foreign-object (output :int)
  (let ((return-code (%do-something output)))
    (values return-code (cffi:mem-ref output :int))))
  • cffi:with-foreign-object创建名为output的指针,指向一块int大小的内存空间
  • 调用%do-something传入指针,获取函数的返回码
  • cffi:mem-ref从output指针指向的内存中读取int类型的值
  • 用values同时返回函数的返回码和output的结果

方法二:手动分配/释放内存

如果需要手动控制内存生命周期,可以用foreign-alloc和foreign-free,但必须确保内存被释放:

(let ((output (cffi:foreign-alloc :int)))
  (unwind-protect
       (let ((return-code (%do-something output)))
         (values return-code (cffi:mem-ref output :int)))
    (cffi:foreign-free output)))
  • cffi:foreign-alloc分配一块int类型的内存,返回对应的指针
  • unwind-protect保证无论函数执行是否成功,都会调用cffi:foreign-free释放内存,防止内存泄漏
  • 同样通过mem-ref读取output的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:20:25