dongpan2788
2017-01-05 18:24
浏览 676
已采纳

如何将Go字符串数组转换为C字符串数组?

I am using cgo in a project, and I want to export a function for use. Here's an example of what I want to achieve:

package csplit

import (
    "C"
    "strings"
)

//export Split
/* The Split function takes two C strings, the second of which represents
   a substring to split on, and returns an array of strings. Example:
       Split("1,2", ",") // gives ["1", "2"]
*/
func Split(original *C.char, split *C.char) []*C.char {
        goResult := strings.Split(C.GoString(original), C.GoString(split))
        cResult := make([]*C.char, len(goResult))

        for idx, substring := range goResult {
                cResult[idx] = C.CString(substring)
        }

        return cResult
}

The problem is that the return type is Go allocated data, and not moved into the C heap. This panics with: runtime error: cgo result has Go pointer

图片转代码服务由CSDN问答提供 功能建议

我正在项目中使用 cgo ,并且我想导出一个函数以供使用 。 这是我要实现的示例:

 程序包csplit 
 
import(
“ C” 
“ strings” 
)
 
 //  export Split 
 / * Split函数接受两个C字符串,其中第二个代表
a要拆分的子字符串,并返回一个字符串数组。 示例:
 Split(“ 1,2”,“,”)//给出[“ 1”,“ 2”] 
 * / 
func Split(原始* C.char,分割* C.char)[]  * C.char {
 goResult:= strings.Split(C.GoString(original),C.GoString(split))
 cResult:= make([] * C.char,len(goResult))
 \  n代表IDX,子字符串:=范围goResult {
 cResult [idx] = C.CString(子字符串)
} 
 
返回cResult 
} 
   
 
 < 问题是返回类型是Go分配的数据,而不是移入C堆。 出现以下错误:运行时错误:cgo结果具有Go指针  
 
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • doujinai2183 2017-01-05 19:32
    已采纳

    You're returning a Go slice which is allocated in Go, and is a different structure than a C array. You need to allocate an array in C:

    //export Split
    func Split(original *C.char, split *C.char) **C.char {
        goResult := strings.Split(C.GoString(original), C.GoString(split))
        cArray := C.malloc(C.size_t(len(goResult)) * C.size_t(unsafe.Sizeof(uintptr(0))))
    
        // convert the C array to a Go Array so we can index it
        a := (*[1<<30 - 1]*C.char)(cArray)
    
        for idx, substring := range goResult {
            a[idx] = C.CString(substring)
        }
    
        return (**C.char)(cArray)
    }
    
    点赞 打赏 评论

相关推荐 更多相似问题