Golang cgo * C.int大小差异

时间:2019-03-20 16:56:09

标签: c go types cgo

我正在研究CGO,我遇到了一个奇怪的问题,即go运行时中C.int的大小为8个字节,而C int为4个字节。我知道,根据架构,Go int可以为64位或32位,而C ints始终为32位。是 有没有一种标准的方法告诉C.int类型使用4个字节?我找不到与此相关的文档。

因此,该代码无法按预期运行。它基本上将低端添加到第一个int的高端。它从不引用传递的第二个int。

谢谢。

实际输出:

0xc00001a0b0
0xc00001a0b8
0xc00001a0b0
0xc00001a0b4
199
0
199

main.go

package main

/*
int addNums(int *nums);
*/
import "C"

import (
    "fmt"
    "unsafe"
)

func main() {
    var nums [2]C.int
    numsPtr := (*C.int)(unsafe.Pointer(&nums))
    fmt.Println(numsPtr)
    *numsPtr = 199
    numsPtr = (*C.int)(unsafe.Pointer(uintptr(unsafe.Pointer(numsPtr)) + unsafe.Sizeof(numsPtr)))
    fmt.Println(numsPtr)
    *numsPtr = 3
    res, err := C.addNums((*C.int)(unsafe.Pointer(&nums[0])))
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(res)
}

lib.c

long addNums(int *nums)
{
  printf("%p\n", &nums[0]);
  printf("%p\n", &nums[1]);
  printf("%d\n", nums[0]);
  printf("%d\n", nums[1]);
  return (nums[0] + nums[1]);
}

1 个答案:

答案 0 :(得分:0)

我知道了。愚蠢的错误。我增加了指针的大小-64位地址-而不是整数的大小。修改后的go文件:

package main

/*
int addNums(int *nums);
*/
import "C"

import (
    "fmt"
    "unsafe"
)

func main() {
    var nums [2]int32
    fmt.Println(unsafe.Sizeof(nums))
    numsPtr := (*C.int)(unsafe.Pointer(uintptr(unsafe.Pointer(&nums))))
    fmt.Println(numsPtr)
    *numsPtr = 199
    numsPtr = (*C.int)(unsafe.Pointer(uintptr(unsafe.Pointer(numsPtr)) + unsafe.Sizeof(*numsPtr)))
    fmt.Println(numsPtr)
    *numsPtr = 3
    res, err := C.addNums((*C.int)(unsafe.Pointer(&nums)))
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(res)
}