关于函数返回指针的问题

我写了这个测试代码:


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)

}

我希望看到:


11

11

address1

address1

假设第二次调用将为函数变量使用相同的空间(基于我的 C 背景,在函数停止工作后,所有放置在堆栈中的函数变量都可以用下一个函数调用重写)。但相反,我得到了:


5

11

address1

address2

为什么我可能会得到这个结果?为什么与预期输出有差异?


牛魔王的故事
浏览 120回答 1
1回答

慕妹3242003

这种行为是逃逸分析的结果。编译器检测到变量result转义了函数,所以它是在堆上分配的。这就是为什么每次调用都getIntPointer返回一个新result指针的原因。该函数等价于:func getIntPointer(i int) *int {    result:=new(int)    *result=i+1    return result}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go