如何将Go的[]字节转换为C的* uint8_t

问题描述 投票:1回答:1

我想使用Go在C结构中设置uint8_t *。Go中的数据来自ELF,是一个字节片。这是我目前收到的错误:

cannot use &buf[0] (type *byte) as type *_Ctype_uchar in assignment

使用此代码:

args.vm_snapshot_data = &buf[0]

我该怎么办?

[当我使用适当的演员表时:args.vm_snapshot_data = (*C.uint8_t)(&buf[0])我收到此错误:panic: runtime error: cgo argument has Go pointer to Go pointer

c go elf cgo
1个回答
0
投票

Golang计数类型,而不是它们的兼容性。而且只有一种方法可以将unsafe.Pointer作为原始值来覆盖该位置。

args.vm_snapshot_data = (*C.uint8_t)(unsafe.Pointer(&buf[0]))

如果不确定在C端使用时buf slice是否在Go端仍然有效(垃圾收集器可能会丢弃它,那么您必须使用复制并手动将其丢弃。

args.vm_snapshot_data = (*C.uint8_t)(C.CBytes(buf))

...

C.free(unsafe.Pointer(args.vm_snapshot_data))
© www.soinside.com 2019 - 2024. All rights reserved.