【发布时间】:2019-11-20 19:30:35
【问题描述】:
我写了下面的代码。我知道返回一个变量的地址 在函数中创建是错误的方法,因为创建的局部变量将在堆栈中,并且 完成函数后,变量将从堆栈中弹出。 我创建了一个名为“latif”的人。然后我使用了 changeName() 函数。它将人员结构的名称字段更改为“uluman”。它返回了局部变量的地址。完成函数后,应该弹出局部变量。然后我调用 sum() 函数来保证堆栈会改变(sum 函数的参数将被推送。换句话说,内存中的单元格值 x 点应该改变)。所以 x 指向堆栈中的某个位置。
package main
import "fmt"
type Person struct{
name string
age int
}
func sum(a, b int)int{
return a+b
}
func (t Person ) changeName(value string)*Person{
t.name = value
return &t //Delibiratly the address of the local variable is returned
}
func main(){
t := Person{name : "latif" }
fmt.Println("Before" , t.name)
x := t.changeName("uluman")
_= sum(5,10)
fmt.Println("After" , x.name)
return
}
我预计 fmt.Println(x.name) 应该打印与 'uluman' 不同的东西,因为 x 点堆栈地址已经改变,但是它打印了'uluman'。 这里有什么问题?
【问题讨论】:
-
"在函数中创建的变量的地址是错误的方法,因为创建的局部变量将在堆栈中,并且在完成函数后,变量将从堆栈中弹出" false。任何将获取指针的变量都将在堆上分配并由 GC 管理。
-
@JimB 感谢您的回复。我找不到链接。
-
specification 对堆分配和堆栈分配之间的区别保持沉默。事实上,规范不包含“堆”或“堆栈”这两个词。这个问题是基于来自其他语言的概念包袱。