因此,假设我绝对需要在 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
- 1 回答
- 0 关注
- 93 浏览
添加回答
举报
0/150
提交
取消