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

How do I declare a pointer at a specific memory address in go golang and store a value there

所以假设我绝对需要在 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 documentation:

  • A pointer value of any type can be converted to a Pointer.
  • A Pointer can be converted to a pointer value of any type.
  • A uintptr can be converted to a Pointer.
  • A Pointer can be converted to a uintptr.

请注意,“指针”(大写)指的是 unsafe.Pointer,而“指针值”指的是常规 Go 指针,例如 *int

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完全是随意的。您可以使用任何类型,这将决定“值”在此上下文中的含义。