我写了这个测试代码:import "fmt"func getIntPointer(i int) *int { var result int result = i + 1 return &result}func main () { ip1 := getIntPointer(4) ip2 := getIntPointer(10) fmt.Println(*ip1, *ip2) fmt.Printf("%p %p\n", ip1, ip2)}我希望看到:1111address1address1假设第二次调用将为函数变量使用相同的空间(基于我的 C 背景,在函数停止工作后,所有放置在堆栈中的函数变量都可以用下一个函数调用重写)。但相反,我得到了:511address1address2为什么我可能会得到这个结果?为什么与预期输出有差异?
1 回答

慕妹3242003
TA贡献1824条经验 获得超6个赞
这种行为是逃逸分析的结果。编译器检测到变量result转义了函数,所以它是在堆上分配的。这就是为什么每次调用都getIntPointer返回一个新result指针的原因。该函数等价于:
func getIntPointer(i int) *int {
result:=new(int)
*result=i+1
return result
}
- 1 回答
- 0 关注
- 82 浏览
添加回答
举报
0/150
提交
取消