从Go中的字符串访问内存地址?

时间:2017-05-03 17:25:59

标签: pointers go memory-address

在golang中,我可以从给定的字符串中打印内存地址的值吗?

例如,如果运行以下代码:

a := "A String"
fmt.Println(&a)

打印0x1040c108

我怎样才能获取0x1040c108之类的字符串并打印存储在内存中的字符串的值?像fmt.Println(*0x1040c108)

这样的东西

这可能吗?

3 个答案:

答案 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)
}