Получение структуры Golang из пустого указателя C - PullRequest
0 голосов
/ 12 октября 2018

У меня есть структура 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)
}

и в итоге получаюsegfault:

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 приводит к segfault, но я озадачен тем, откуда взялась эта 5!

...