Pointers 从函数中的局部变量返回指针
我正在读一本名为Go编程语言的书,在第二章关于指针的内容中,我写了以下内容 函数返回局部变量的地址是完全安全的。例如,在 在下面的代码中,由这个对f的特殊调用创建的局部变量v将仍然存在 调用返回后,指针p仍将引用它:Pointers 从函数中的局部变量返回指针,pointers,go,Pointers,Go,我正在读一本名为Go编程语言的书,在第二章关于指针的内容中,我写了以下内容 函数返回局部变量的地址是完全安全的。例如,在 在下面的代码中,由这个对f的特殊调用创建的局部变量v将仍然存在 调用返回后,指针p仍将引用它: 我完全不明白,一个局部变量应该在函数执行后被销毁。这是因为可能在堆上分配了v。我知道在C中,如果使用malloc分配空间,函数执行后它不会被销毁,因为它在堆上。Go不是C。尽管有相似之处,但它的级别要高得多。它利用了一个完整的运行时,带有一个绿色的线程调度程序和垃圾收集内存管理器。
我完全不明白,一个局部变量应该在函数执行后被销毁。这是因为可能在堆上分配了v。我知道在C中,如果使用malloc分配空间,函数执行后它不会被销毁,因为它在堆上。Go不是C。尽管有相似之处,但它的级别要高得多。它利用了一个完整的运行时,带有一个绿色的线程调度程序和垃圾收集内存管理器。只要有活动引用,它就永远不会收集内存 Go编译器包括一个称为“转义分析”的阶段,它跟踪每个变量,以查看它是否“转义”声明它的函数。任何可以转义的值都在堆上分配并由垃圾收集管理;否则,它(通常)在堆栈上分配 您可以找到有关该主题的更多信息:
nil
指针不应出现segfault,但它会触发死机。SIGSEGV实际上被视为分段故障,或者是由无效内存引用引起的故障,无论您如何调用它。Local指的是变量的范围,而不是值的分配方式。规范中没有关于所有变量分配的详细信息。请问您有什么资料可以让我了解更多信息吗?只是添加了一些参考资料。
var p = f()
func f() *int {
v := 1
return &v
}