2 回答
TA贡献1820条经验 获得超2个赞
我终于可以String[]从GOusing中返回 a 了cgo。
我将留下函数签名:
//export getSearchKeys
func getSearchKeys(numKeysByReference *C.int) **C.char {
*numKeysByReference = // ... some value
// Using the C helper defined above
set_char := C.cmalloc(*numKeysByReference)
// Logic allocating and populating C.char[i .. *numKeysByReference]
// ...
return set_char
}
在使用,创建**C.char结构后,我收到如下数据:cgoJava
IntByReference intByReference = new IntByReference();
PointerByReference array = lib.getSearchKeys(intByReference);
String[] results = array.getPointer().getStringArray(0, intByReference.getValue());
正如@PeterSO 提到的,我们defer C.free()在使用它后打电话。否则,它会在返回后被释放。
TA贡献1799条经验 获得超6个赞
你写:
func getSearchKeysA() **C.char {
set_char := C.cmalloc(0)
defer C.free(unsafe.Pointer(set_char))
C.setElement(set_char, C.CString("hello world"), C.int(0))
return set_char
}
这可能执行为:
func getSearchKeysA() (retval **C.char) {
set_char := C.cmalloc(42)
C.setElement(set_char, C.CString("hello world"), C.int(1))
retval = set_char
C.free(unsafe.Pointer(set_char))
return retval
}
你是指set_char之后free吗?
2019 年 7 月 31 日的 Go 编程语言规范版本
延迟语句
“defer”语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻,要么是因为周围函数执行了一个 return 语句,到达了它的函数体的末尾,要么是因为相应的 goroutine 正在恐慌。
你写:
set_char := C.cmalloc(0)
static char** cmalloc(int size) {
return (char**) malloc(size * sizeof(char*));
}
$ 人 malloc
malloc() 函数分配 size 个字节并返回一个指向已分配内存的指针。内存未初始化。如果 size 为 0,则 malloc() 返回 NULL 或稍后可以成功传递给 free() 的唯一指针值。
为什么分配大小 0(零)?
malloc内存未初始化。
- 2 回答
- 0 关注
- 338 浏览
添加回答
举报