【发布时间】:2015-10-16 11:19:51
【问题描述】:
我想知道在将slice 附加到之后,指向slice 元素的指针的行为是什么,例如:
package main
import "fmt"
func main() {
my_slice := []int {3}
silly_ptr := &my_slice[0]
// Do we know that silly_ptr points to value equal 3
// all the time? (If we don't explicitly change it).
fmt.Printf("%p\n", silly_ptr)
fmt.Println(*silly_ptr)
for i := 0; i < 10; i++ {
my_slice = append(my_slice, i)
}
silly_ptr_2 := &my_slice[0]
fmt.Printf("%p\n", silly_ptr_2)
fmt.Println(*silly_ptr_2)
}
产生:(没有惊喜)
0xc20800a200
3
0xc20805a000
3
我知道当附加到动态数组时,在某些时候我们已经重新填充了整个数组,因此原始数组元素的内存地址是不可靠的。据我所知,类似的代码在c++ 中有效,但silly_ptr 可能指向任何东西。 rust 不允许在 vector 被借用时对其进行变异,因此上述逻辑将无法编译。
但是Go 呢?我知道 escape analysis 返回指向局部变量的指针是有效的,该变量将在堆上为您创建。我的直觉告诉我,同样的逻辑也适用于上述情况。 silly_ptr 指向的内存位置不会被重新填充,因此将始终存储3(如果我们不明确更改它)。是这样吗?
【问题讨论】: