我正在研究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]);
}
答案 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)
}