1 回答

TA贡献2041条经验 获得超4个赞
溶液:
C 侧 (GO) -- 应注释位置的行defer C.free...
package main
//#include <stdlib.h>
import "C"
import (
"fmt"
"unsafe"
)
//export TestLoad
func TestLoad(cstr *C.char) **C.char {
gostr := C.GoString(cstr)
fmt.Println("In Go: ", gostr)
goslice := []string{gostr, "i 0", "i 1", "i 2", "i 3"}
cArray := C.malloc(C.size_t(len(goslice)) * C.size_t(unsafe.Sizeof(uintptr(0))))
// defer C.free(unsafe.Pointer(cArray))
temp := (*[1<<30 - 1]*C.char)(cArray)
for k, v := range goslice {
temp[k] = C.CString(v)
}
return (**C.char)(cArray)
}
func main() {
}
蟒蛇侧 -- 修改:指针(c_char_p * 5),然后调用 resp.content 来访问每个蟒蛇字节。有关源代码,请参阅示例 #17。
from ctypes import *
mylib = cdll.LoadLibrary("./_mylib.so")
mylib.TestLoad.argtype = c_char_p
mylib.TestLoad.restype = POINTER(c_char_p*5)
pystr = "Hello, world!"
b = pystr.encode("utf-8")
resp = mylib.TestLoad(b)
'''**********************************'''
output = []
for seq in resp.contents:
s = seq.decode("utf-8")
output.append(s)
print(s,type(s))
print(output)
'''**********************************'''
一个新的问题出现了:
会评论 // 推迟 C.免费(不安全。指针(cArray))导致C端的内存泄漏在这个例子中?
- 1 回答
- 0 关注
- 78 浏览
添加回答
举报