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