存储指向堆栈值的指针(Golang)

2024-03-30

我正在尝试用 Go 进行实验,看看如果我将指向变量的指针存储在堆栈上,然后在原始变量离开作用域后访问该变量,会发生什么情况。

package main

import "fmt"

var p chan bool;

// a temp struct
type v struct {
    a int
}

func another_thread(vx *v) {
    // this code should be executed after a() returns so vx should be a pointer to a value that's no longer on the stack
    fmt.Printf("another_thread(): %p\n", vx);
    vx.a = 4 // am I updating a dangling pointer that may have unintentional side effects??
    fmt.Println(" - ", vx.a);
    p<-true;
}

func update_v(vx *v) {
    vx.a = 3;

    fmt.Printf("update_v(): %p\n", vx);

    go another_thread(vx)
}

func alloc_on_stack() {
    // allocate v1 on the stack
    var v1 v
    v1.a = 1

    fmt.Printf("alloc_on_stack(): %p\n", &v1);

    // pass a pointer to v1 on the stack
    update_v(&v1)

    // print '3' to prove byref actually took it by reference
    fmt.Println(" - ", v1.a);

    // when the function returns, v1 should be popped off the stack
}

func main() {
    p = make(chan bool)
    alloc_on_stack();
    fmt.Println("outside of alloc_on_stack, waiting");
    <-p;
    fmt.Println("done");
}

在alloc_on_stack中,v1作为局部变量存储在堆栈上。我将指向 v1 的指针传递给 update_v,后者将其传递给 another_thread。 another_thread 直到 alloc_on_stack 完成后才会执行。

然而,当我运行该代码时,我没有收到任何错误,而是看到了以下内容:

alloc_on_stack(): 0x1043617c
update_v(): 0x1043617c
 -  3
outside of alloc_on_stack, waiting
another_thread(): 0x1043617c
 -  4
done

another_thread 中的 vx 不应该是一个悬空指针吗?


没有。 Go 编译器检测到您正在获取局部变量的地址,并保留它,直到对它的所有引用都消失。从那时起,该变量就可以被垃圾回收了。

这就是为什么这样的事情不仅被允许,甚至是惯用的:

func foo() *Bar {
  return &Bar{42, "frob"}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

存储指向堆栈值的指针(Golang) 的相关文章

  • Go中如何自定义http.Client或http.Transport超时重试?

    我想实现一个自定义http Transport对于标准http Client 如果客户端超时 它将自动重试 附 由于某种原因 习俗http Transport is a 一定有 我已经查过了hashcorp go retryablehttp
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作
  • 为什么 char 指针保存的数据比 C 中分配的内存更多?

    在使用 C 进行动态内存分配时 我在将内存大小分配给 char 指针时感到困惑 虽然我只给出 1 个字节作为限制 char 指针成功地接收尽可能长的输入 假定每个字母对应 1 个字节 我还尝试查找输入前后指针的大小 我怎样才能理解这里发生了
  • 如何将 char 转换为 unsigned int?

    我有一个字符数组 它实际上用作字节数组 而不是用于存储文本 在数组中 有两个特定字节表示我需要存储到无符号 int 值中的数值 下面的代码解释了设置 char bytes bytes 2 bytes 0 0x0C For the sake
  • 我怎么知道我的所有 goroutine 确实正在使用 golang 的同步包等待一个条件

    我有一个应用程序 我正在创建多个 goroutine 来同时执行某个任务 所有工作协程都会等待条件 事件发生 一旦事件被触发 它们就会开始执行 创建完所有goroutines后 主线程在发送广播信号之前应该知道所有goroutines确实处
  • 指针数组和数组指针的区别?

    char string1 3 4 koo kid kav This is a 2D array char string 3 koo kid kav This is an array of 3 pointers pointing to 1D
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2
  • Golang 正则表达式命名组和子匹配

    我正在尝试匹配正则表达式并获取匹配的捕获组名称 当正则表达式仅与字符串匹配一次时 这是有效的 但如果它与字符串匹配多次 SubexpNames不返回重复的名称 这是一个例子 package main import fmt regexp fu
  • Golang GAE - 小胡子结构中的 intID

    这是一个Example https www dropbox com sh ur2ws1jnik6euef PjVJSwDTUc Blog Golang zip该应用程序的 关键代码在 golang code handler handler
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • 复杂数据类型作为 Go 中映射的键

    我正在尝试在 Go 中创建一个由大整数作为键的映射 effective Go 明确指出 结构体 数组和切片不能用作映射键 因为这些类型上没有定义相等性 这是有道理的 我当然可以将大整数转换为字符串并使用字符串作为键 但我在这里寻找更通用的解
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • char*str={"foo",...} 和 char str[][5]={"foo",...} 数组定义之间有什么区别?

    Case 1 当我写作时 char str what is this then str i newstring 是有效的 而str i j j 是无效的 Case 2 当我写作时 char str 5 what is this then s
  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • 修改C中的const char *

    我正在练习面试 我目前遇到的问题是反转 C 中的常量字符串 我知道由于 str2 是 const 所以我可以修改 str2 指向的位置 但不能修改它的值 我下面有一个名为reverse const 的函数 它会将 const char st
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • C++:向 std::sort 提供模板化比较函数

    假设我想让 std sort 根据指针指向的 int 值对指向 int 的指针向量进行排序 忽略那里明显的性能问题 很简单吧 做一个函数 bool sort helper const int a const int b return a l
  • CLI/C++:void* 到 System::Object

    这是一个类似的问题这个帖子 https stackoverflow com questions 1154929 void to object in c cli 我一直无法用它来解决我的问题 我在这里包含了一些代码 希望能帮助某人了解其他帖子

随机推荐

  • 从 Javascript Transformers 访问 Mirth Connect REST API (Mirth 3.5.1)

    我正在努力从 mirth connect 通道的源 javascript 转换器访问 mirth connect Rest api 端点 我的目标是能够使用转换器中的 javascript 代码导出和导入通道组 我知道不可能使用 XHR 因
  • 使用元 http-equiv 标记进行重定向时,避免将页面添加到浏览器历史记录中

    我有一个网页 它使用以下命令重定向到所需的目标网址 我想避免第一页出现在浏览器历史记录中 特别是 在手机 Android iOS 等 中 我希望后退按钮可以跳过重定向页面 您有两个选择 要么使用真正的 HTTP 重定向 要么使用 JavaS
  • 制作一个 Angular *ngFor 绘制两列不同的数据[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试创建一个 ngFor 指令将数据放入两列 而不是像往常一样只放入一列 我什至按照我在那里看到的例子进行操作 但根本不起作
  • 发送 AT 命令到 Android 手机

    我想向 Android 手机发送 AT 命令 我知道SDK不支持这个 但有两种解决方案 更改内核代码并发布你的新Android 看来很难 环回开启USB 我认为蓝牙是一样的 关于第二种解决方案 当您将手机连接到PC时USB电缆 你会看到一个
  • 如何在 TWIG 中使用转储?

    我简单地添加模板 index html twig dump product 我有错误 The function dump does not exist in AcmeStoreBundle Default index html twig a
  • Instagram Oauth2 隐式身份验证重定向到页面不可用,如果您输入错误的密码

    我正在使用 oauth2 Instagram 隐式流程在 Instagram 中登录 我使用的基本网址是这样的 这个网址向我显示了 Instagram 登录页面 我输入了用户和密码 如果正确 API 会将我重定向到redirect uri
  • 如何使用pid获取进程状态?

    如果我知道一个进程的 pid 我如何使用 Python 判断该进程是否是僵尸进程 你可以使用status特征来自psutil https github com giampaolo psutil import psutil p psutil
  • 将 python (pandas) Dataframe 写入 SQL 数据库错误

    我正在尝试将 python 数据框放入 MS SQL DB 但收到以下错误 FUNCTION def put to server df df is a pandas data frame server KORNBSVM04 MSSQLSER
  • MathJax `\\` 换行符不渲染。简单地显示`\\`

    我使用 MathJax CDN 当我将其放入我的网页时 Say P k n is the probability of By definition 所有数学都正确呈现 但是 显示为 而不是换行符 并且没有换行符 它只是在同一条线上继续 所以
  • 使用node.js pm2在虚拟环境中运行python脚本

    我想参考一下这个问题 https stackoverflow com questions 32127834 how to run run python script like pm2 for nodejs因为我确信有人会将其标记为重复项 我
  • extjs 中的级联组合框

    我想在 extjs 中做级联组合框 我必须组合框 课程组合框 xtype combobox emptyText Course id combo course displayField name valueField id store cou
  • 该项目不是基于 Gradle 的项目。如何从根目录打开项目?

    我被这个问题困扰有一段时间了 绞尽脑汁 我用谷歌搜索了这个答案here https stackoverflow com questions 23752077 no gradle file shown while importing proj
  • java中2组最接近的和

    我在解决这个问题时遇到一些问题 给定一个数组ints 将输入分为 2 组 使其总和尽可能接近 2 组的长度必须相等 或者如果输入是奇数长度 则一组可以比另一组多 1 然后先打印较低的总和 然后打印较高的总和 前任 输入 gt 4 6 17
  • 从序列化的 post_meta (PHP) 中的数组中过滤一些值

    我在 WordPress 中设置了自定义帖子类型 艺术家 我有一个插件可以序列化来自艺术家的元信息 并且我需要按通道过滤此信息 channel s 6 trance 它也在序列化元 show data 中 a 1 s 32 57fba1b1
  • 在c#中比较RGB颜色

    我正在尝试找到一种方法来比较两种颜色以找出它们的相似程度 我似乎找不到有关该主题的任何资源 因此我希望在这里得到一些指示 理想情况下 我希望得到一个分数来表明它们有多相似 例如 0 到 100 其中 100 相等 0 完全不同 Thanks
  • BeautifulSoup:从锚标记中提取文本

    我想提取 来自以下 src 的文本image tag and 锚标记的文本位于div类数据 我成功地提取了 img src 但在从锚标记中提取文本时遇到了问题 a class title href http www amazon com N
  • 上传文件限制

    如何限制上传文件 例如 如果数据库已有 5 个条目 则不应采用第 6 个条目 并展示您只能拥有 5 个文件 我的代码
  • 如何在 MATLAB 中创建用于播放、暂停、快进和快退视频的 GUI?

    我是 MATLAB 新手 我正在尝试创建一个 GUI 来逐帧播放 暂停 快进和快退 avi 视频 目前 我可以通过切换按钮播放和暂停视频 但是当我再次按下播放时 视频从零帧开始播放 我意识到我需要存储下次按播放时使用的帧号 但我不知道该怎么
  • 为什么我会收到 InvalidDnDOperationException?

    I m sorry I don t like asking why am I getting exception questions on StackOverflow bit ironic now that I think of it bu
  • 存储指向堆栈值的指针(Golang)

    我正在尝试用 Go 进行实验 看看如果我将指向变量的指针存储在堆栈上 然后在原始变量离开作用域后访问该变量 会发生什么情况 package main import fmt var p chan bool a temp struct type