【问题标题】:cgo result has go pointercgo 结果有 go 指针
【发布时间】:2018-02-08 13:34:25
【问题描述】:

我正在编写一些导出类似函数的 go 代码:

package main
import "C"

//export returnString
func returnString() string {
    //
    gostring := "hello world"
    return gostring
}
func main() {}

我使用 go build -buildmode=c-shared 构建 .so 和头文件,但是当我在 C 代码中调用 returnString() 时,我得到 panic: runtime error: cgo result has Go pointer

在 go 1.9 中有没有办法解决这个问题?

【问题讨论】:

  • 为什么要将 Go 字符串返回给 C 代码?这里的返回值应该在C中分配。
  • 你的意思是我应该从我的 go 代码中返回一个 CString 吗?
  • 嗯,这是两种不同的结构。调用代码需要什么?

标签: c go cgo


【解决方案1】:

您需要将 go 字符串转换为 *C.charC.Cstring 是它的实用函数。

package main

import "C"

//export returnString
func returnString() *C.char {
    gostring := "hello world"
    return C.CString(gostring)
}

func main() {}

【讨论】:

  • 小心使用 CString。你应该释放内存。
  • 如何释放内存?
  • @HeathMitchell C.free(unsafe.Pointer(cstring)) 应该可以解决问题。
  • @Nebril 我如何在上面代码中的函数返回的值上调用C.free
  • 您应该提供另一个导出函数,例如 FreeString,它接受指针并调用 C.free。然后从 C 中的主代码中,您应该首先调用 returnString(),然后将字符串数据复制到您的 C 字符串,然后调用 FreeString。
猜你喜欢
  • 2016-07-12
  • 2016-06-25
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多