在golang中,我可以从给定的字符串中打印内存地址的值吗?
例如,如果运行以下代码:
a := "A String"
fmt.Println(&a)
打印0x1040c108
。
我怎样才能获取0x1040c108
之类的字符串并打印存储在内存中的字符串的值?像fmt.Println(*0x1040c108)
这可能吗?
答案 0 :(得分:5)
这可以做到,但这确实是一个非常糟糕的主意。无论何时导入unsafe
软件包,您要么做错了,要么就是真正的硬核。我对甚至回答这个问题犹豫不决,但现在就去了。
https://play.golang.org/p/kGWpAiHxzD
package main
import (
"fmt"
"unsafe"
)
func main() {
hi := "HI"
fmt.Println(&hi)
//address is "0x1040c128"
var ptr uintptr = 0x1040c128
printPtrString(ptr)
}
func printPtrString(ptr uintptr) {
p := unsafe.Pointer(ptr)
fmt.Println(*(*string)(p))
}
是的,这几乎与unsafe
godoc的行相差无几。 https://godoc.org/unsafe
另请注意,如果/当您的内存引用不是go字符串时,一切都将崩溃灾难性地崩溃。
答案 1 :(得分:0)
是!! 您可以将地址存储在指针变量中并通过解除伪装来打印其值
i := "something"
ptr := &i
fmt.Println(*ptr)
要使用硬编码地址(例如 0x1040c108 )访问内存,您的程序必须能够访问该内存地址,否则,您将收到错误指示无效的指针间接或分段错误。
答案 2 :(得分:0)
package main
import "C"
import (
"log"
"strconv"
"unsafe"
)
func main() {
// parse the string into an integer value
addr, _ := strconv.ParseInt("0x1040c108", 0, 64)
// cast the integer to a c string pointer
ptr := (*C.char)(unsafe.Pointer(uintptr(addr)))
// convert to a go string (this will segfault)
str := C.GoString(ptr)
// print it
log.Println(str)
}