为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
暮色呼如 2022-09-12 20:16:40
因此,假设我绝对需要在 in go 的特定内存地址处存储一个值。我该怎么做。例如:0xc0000140f0package mainimport (    "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
查看完整描述

1 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

如错误所述,您的类型转换无效。从文档中unsafe.Pointer

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

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

  • 可以将 uintptr 转换为指针。

  • 指针可以转换为 uintptr。

请注意,“指针”(大写)是指,而“指针值”是指常规的 Go 指针,如unsafe.Pointer*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


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信