如何在go golang中声明特定内存地址的指针并在那里存储值



所以我们假设我绝对需要在go中的0xc0000140f0的特定内存地址存储一个值。我该怎么做呢。例如:

package main
import (
"fmt"
"unsafe"
)
func main() {
targetAddress := 0xc0000140f0
loc := (uintptr)(unsafe.Pointer(targetAddress))
p := unsafe.Pointer(loc)
var val int = *((*int)(p))
fmt.Println("Location : ", loc, " Val :", val)
}

这会导致以下错误:

./memory.go:10:33: cannot convert targetAddress (type int) to type unsafe.Pointer

正如错误所说,您的类型转换无效。来自unsafe.Pointer文档:

  • 任何类型的指针值都可以转换为指针
  • 指针可以转换为任何类型的指针值
  • uintptr可以转换为指针
  • 指针可以转换为uintptr

注意;指针";(caps(是指unsafe.Pointer;指针值";指的是像*int这样的常规Go指针

Go有一个严格的类型系统,所以你需要检查你正在使用的合适的类型,并注意类型错误。

尝试从给定内存地址加载值的代码的正确版本是:

package main
import (
"fmt"
"unsafe"
)
func main() {
loc := uintptr(0xc0000140f0)
p := unsafe.Pointer(loc)
var val int = *((*int)(p))
fmt.Println("Location : ", loc, " Val :", val)
}

正如标题所示,您还希望存储一个值,该值如下所示:

*((*int)(p)) = 1234

现在,如果您想维护该指针以继续使用它,您可以将其存储为常规Go指针:

var pointer *int = (*int)(p)
val := *pointer // load something
*pointer = 456 // store something

当然,这里int的使用是完全任意的。你可以使用任何类型,这将决定";一个值";在这种情况下。

最新更新