微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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 documentation

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

请注意,“Pointer”(大写)指的是 unsafe.Pointer,而“pointer value”指的是常规的 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 是完全随意的。您可以使用任何类型,这将确定此上下文中“值”的含义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。