从C void指针检索Golang结构

时间:2018-10-12 18:04:01

标签: go cgo

我有一个看起来像这样的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的来源感到困惑!

0 个答案:

没有答案