首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在go golang中声明指向特定内存地址的指针并将值存储在那里

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

Stack Overflow用户
提问于 2021-07-09 18:17:54
回答 1查看 562关注 0票数 0

因此,假设我绝对需要在go中存储0xc0000140f0的特定内存地址的值。我该怎么做。例如:

代码语言:javascript
运行
复制
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)
}

这将导致以下错误:

代码语言:javascript
运行
复制
./memory.go:10:33: cannot convert targetAddress (type int) to type unsafe.Pointer
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-09 18:41:32

正如错误所述,类型转换无效。来自unsafe.Pointer 文档

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

请注意,“指针”(大写)指的是unsafe.Pointer,而“指针值”是指常规的Go指针,如*int

Go有一个严格的类型系统,因此您需要检查所使用的类型,并注意类型错误。

试图从给定内存地址加载值的代码的正确版本如下:

代码语言:javascript
运行
复制
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)
}

正如标题所示,您还希望存储值,该值如下所示:

代码语言:javascript
运行
复制
*((*int)(p)) = 1234

现在,如果您想要维护该指针以继续使用它,则可以将其存储为常规的Go指针:

代码语言:javascript
运行
复制
var pointer *int = (*int)(p)
val := *pointer // load something
*pointer = 456 // store something

当然,在这里使用int完全是任意的。您可以使用任何类型,这将确定“值”在此上下文中的含义。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68321230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档