【问题标题】:How do I declare a pointer at a specific memory address in go golang and store a value therego - 如何在go golang中的特定内存地址声明一个指针并在那里存储一个值
【发布时间】:2021-07-09 18:17:54
【问题描述】:

因此,假设我绝对需要在 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

【问题讨论】:

  • 如果有人使用var targetAddress uintptr = 0xc0000140f0,这个“有效”,但我对 Go 的了解还不够,不能说这是一个很好的解决方案。
  • 该错误显示您在哪里使用 int,它不是转换为 unsafe.Pointer 的类型。使用uintptr(尽管这会导致未定义的行为,并且会因“可能滥用 unsafe.Pointer”而失败go vet
  • jakub - 你的评论成功了。

标签: go memory memory-management


【解决方案1】:

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

  • 任何类型的指针值都可以转换为指针。
  • 指针可以转换为任何类型的指针值。
  • uintptr 可以转换为指针。
  • 指针可以转换为 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 完全是任意的。您可以使用任何类型,这将确定“值”在此上下文中的含义。

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多