猿问

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

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


暮色呼如
浏览 95回答 1
1回答

守候你守候我

如错误所述,您的类型转换无效。从文档中:unsafe.Pointer任何类型的指针值都可以转换为指针。指针可以转换为任何类型的指针值。可以将 uintptr 转换为指针。指针可以转换为 uintptr。请注意,“指针”(大写)是指,而“指针值”是指常规的 Go 指针,如unsafe.Pointer*intGo有严格的类型系统,因此您需要检查您正在使用的内容的适当类型,并注意类型错误。尝试从给定内存地址加载值的代码的正确版本是这样的:package mainimport (    "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
随时随地看视频慕课网APP

相关分类

Go
我要回答