我在 Go 中有一個函數:func login(user *C.char) *C.char { cstr := C.CString("Hello World") defer C.free(unsafe.Pointer(cstr)) return cstr }我的紅寶石代碼如下module GoLib extend FFI::Library ffi_lib './golib.so' attach_function :login, [:string], :stringendGoLib.login("User1") #=> "p\x9A\xA0\xDB\x16V"它不會作為紅寶石字符串返回。我該如何解決這個問題?
1 回答

呼喚遠方
TA貢獻1856條經驗 獲得超11個贊
如評論中所述,cstr在將控制權傳遞給 Ruby 后獲得自由。這是一個解決方法,您可以在 Ruby 中顯式管理指針。
package main
// #include <stdlib.h>
import "C"
import "unsafe"
//export login
func login(user *C.char) *C.char {
return C.CString("Hello from Go")
}
//export logout
func logout(c *C.char) {
C.free(unsafe.Pointer(c))
}
func main() {}
在紅寶石中:
require 'ffi'
module GoLib
extend FFI::Library
ffi_lib './so.so'
attach_function :login, [:string], :strptr
attach_function :logout, [:pointer], :void
end
s, p = GoLib.login("User1")
puts s
p = FFI::AutoPointer.new(p, GoLib.method(:logout))
請注意此處strptr
演示的使用
- 1 回答
- 0 關注
- 121 瀏覽
添加回答
舉報
0/150
提交
取消