Function 返回堆栈上的指针

Function 返回堆栈上的指针,function,go,stack,Function,Go,Stack,在C语言中,当我从函数返回堆栈创建变量的指针时,函数返回后内存将丢弃,从而使指针无法取消引用。但是在围棋中,编译器没有给我任何错误。这是否意味着这样做是安全的 package main import ( "fmt" ) func main() { fmt.Println(*(something())) } func something() *string { s := "a" return &s } 是的,这是安全的,也是围棋编程的正常模式。Go

在C语言中,当我从函数返回堆栈创建变量的指针时,函数返回后内存将丢弃,从而使指针无法取消引用。但是在围棋中,编译器没有给我任何错误。这是否意味着这样做是安全的

package main

import (
    "fmt"
)

func main() {
    fmt.Println(*(something()))
}

func something() *string {
    s := "a"
    return &s
} 

是的,这是安全的,也是围棋编程的正常模式。Go使用指针将任何值自动从堆栈转移到堆中。您不需要关心分配值的位置

从Go常见问题解答:

如果编译器无法证明函数返回后未引用该变量,则编译器必须在垃圾收集堆上分配该变量,以避免悬空指针错误


通过使用
-gcflags-m
选项,您可以在编译期间看到这些优化选项

是的,在Golang中,可以返回指向局部变量的指针。Golang将为您管理对象的生命周期,并在指向它的所有指针消失后释放它

在另一个答案中,我指出了C/C++指针和Golang指针之间的所有区别: