在C函数中更改golang C.String变量的值

Mar*_*ski 2 go cgo

我想从C函数中获取一个int和string.int - 错误代码,字符串 - 数据.

试过这样的方式:

package main
/*
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int test(char *out){
  snprintf(out, sizeof out, "1234567890abcd");
  return 0;
}

*/
import "C"

import (
  "fmt"
  "unsafe"
)

func main() {
  foo := C.CString("")
  defer C.free(unsafe.Pointer(foo))
  C.test(foo)
  fmt.Println("Output is: "+C.GoString(foo))
}
Run Code Online (Sandbox Code Playgroud)

它几乎奏效了.

输出为:1234567

但应该是:1234567890abcd

我认为传递给C函数的C.String的大小是8.但是我不知道如何扩展它(固定大小<> 8)或变为动态.

所以问题是:我应该如何将该变量传递给C?

Ben*_*ish 7

您正在sizeof指针上调用该函数.指针的大小在您的计算机上是8个字节,因此您将获得长度为8的字符串.

我不知道你应该如何管理你的指针大小的所有细节,因为我不擅长C,但这个例子说明了如何解决你的直接问题.

package main
/*
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int test(char *out){
  snprintf(out, 16, "1234567890abcd");
  return 0;
}

*/
import "C"

import (
    "fmt"
    "unsafe"
)

func main() {
    foo := C.CString("")
    defer C.free(unsafe.Pointer(foo))
    C.test(foo)
    fmt.Println("Output is: "+C.GoString(foo))
}
Run Code Online (Sandbox Code Playgroud)