我有一个看起来像这样的C结构:
struct room {
void *reset_first;
}
我有一个看起来像这样的Golang结构:
type reset struct {
command string
}
由于cgo的乐趣,我可以从Go中执行以下操作:
func someStuff(a *C.room, b *reset) {
a.reset_first = unsafe.Pointer(b)
}
一切都很好
然后我尝试稍后进行检索:
func otherStuff(a *C.room) {
var r = (*reset)(a.reset_first)
fmt.Println(r.command)
}
最后我遇到了段错误:
Thread 12 "test" received signal SIGSEGV, Segmentation fault.
316 fmt.Println(r.command)
但是我通过gdb检查得到的一些值使我感到惊讶:
(gdb) info args
a = 0x7fffd5bc2d48
(gdb) info locals
r = 0x5
(gdb) print a
$1 = (struct main._Ctype_struct_room *) 0x7fffd5bc2d48
(gdb) print b
$2 = (struct main.reset *) 0x5
(gdb) print *a
3 = {_type = 2, _ = "\000\000\000", reset_first = 0xc422224a80}
r
如何以0x5
而不是0xc422224a80
结束?
我不奇怪尝试取消引用5会导致段错误,但是我对5的来源感到困惑!