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

时间:2016-07-11 14:50:46

标签: go cgo

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

试着这样:

errortMsg = this.myform.controls['password'].validatePw

它几乎奏效了。

  
    
      

输出为:1234567

    
  

但应该是:1234567890abcd

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

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

3 个答案:

答案 0 :(得分:6)

您正在指针上调用函数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))
}

答案 1 :(得分:1)

经过研究,我找到了解决方案:

package main


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

int test(char *out, int len){
  snprintf(out, len, "1234567890123456789012345671`iknvcap9nv1-93hbf1-39b");
  return 0;

}

*/
import "C"

import (
  "fmt"
  "unsafe"
)

func main() {
  buf := make([]byte, 8192)
  C.test((*C.char)(unsafe.Pointer(&buf[0])), C.int(len(buf)))
  fmt.Println(string(buf))
}

要从C函数接收'string',我必须创建一个切片:

  buf := make([]byte, 8192)

并传递一个指向它的指针:

  C.test((*C.char)(unsafe.Pointer(&buf[0])), C.int(len(buf)))

在这种情况下使用C.String无效。

答案 2 :(得分:0)

对于将来遇到此问题的任何人,C.CString确实可以工作,您不能将sizeof与指针一起使用,因为它始终为8个字符。我是通过以下方式完成的:

package main

/*
#include <stdlib.h>
#include <string.h>

int test(char* out){
  strcpy(out, "1234567890123456789012345671`iknvcap9nv1-93hbf1-39b");
  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))
}