如何调用带输出指针参数的外部函数并获取返回值?(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
相关产品推荐
相关产品推荐

