slice地址问题

peachestao · 2019-11-10 22:11:33 · 1723 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-11-10 22:11:33 的主题,其中的信息可能已经有所发展或是发生改变。

var a = []int{1,2,3}
fmt.Printf("%p\n", &a)
b :=a
fmt.Printf("%p\n",&b) // 问题1、为什么b的地址跟a不同,他们不是共享底层数组吗?
b = append(b,0)
fmt.Printf("%p\n", &b) // 问题2、为什么b的地址维持不变?append时b的长度不够应该重新分配了内存空间吧
fmt.Println(a)
fmt.Println(b)

运行结果:

0xc04204c3a0
0xc04204c3e0
0xc04204c3e0
[1 2 3]
[1 2 3 0]

望答疑,谢谢!


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1723 次点击  ∙  1 赞  
加入收藏 微博
3 回复  |  直到 2019-11-15 23:19:05
chobist
chobist · #1 · 5年之前

我的理解: 切片 b的声明写法 b:=a[:] ,你的写法相当于值传递,所以内存地址不一样。

peachestao
peachestao · #2 · 5年之前

谢谢,这两个问题我已经弄清楚了

问题1:

b:=a //把a赋值给b,系统会给b分配一个地址,指向的底层数组跟a是一样的 fmt.Printf("%p\n",&b) //输出的是b变量本身的地址,而不是底层数组的地址,如果 fmt.Printf("%p",&b[0])打印,发现结果和&a[0]是一样的的,证明a和b共享底层数组内存

问题2:

b=append(b,0) fmt.Printf("%p\n",&b) //b变量的地址没有变,而是b指向的底层数组内存地址变了,如果 fmt.Printf("%p",&b[0])打印,发现append操作前后是不一样的。

zhu_jinlong
zhu_jinlong · #3 · 5年之前

Test

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传