gpt4 book ai didi

c - Golang cgo *C.int 大小差异

转载 作者:数据小太阳 更新时间:2023-10-29 03:20:12 30 4
gpt4 key购买 nike

我正在探索 CGO,我遇到了一个怪癖,在 go 运行时中 C.int 的大小是 8 个字节,但 C int 是 4 个字节。我知道 Go int 可以是 64 位或 32 位,具体取决于体系结构,而 C int 始终是 32 位。是有一种标准方法可以告诉 go 对 C.int 类型使用 4 个字节吗?我无法找到处理此问题的文档。

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

提前致谢。

实际输出:

0xc00001a0b0
0xc00001a0b8
0xc00001a0b0
0xc00001a0b4
199
0
199

主.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)
}

库文件

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]);
}

最佳答案

我想通了。愚蠢的错误。我增加了指针的大小——64 位地址——而不是 int 的大小。修改后的 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)
}

关于c - Golang cgo *C.int 大小差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55266246/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com