由 fmt.Printf 引发的 a==c 结果不一致的诡异问题

weixin_38067871 2019-09-20 10:53:26

### 由 fmt.Printf 引发的 a==c 结果不一致的诡异问题

```go
import (
"fmt"
)

type obj struct{}

func main() {
a := &obj{}
fmt.Printf("%p\n", a)
b := *a
c := &b
// fmt.Printf("%p\n", c)
fmt.Println(a == c)
}

```

注释行 fmt.Printf("%p\n", c) , a == c 输出 false
取消注释, a == c 输出 true
请高手指教下,为什么会出现这种情况
...全文
51 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38077477 2019-09-20
  • 打赏
  • 举报
回复
1. Printf 第二个参数是interface类型,导致内存逃逸到堆上 ``` func Printf(format string, a ...interface{}) (n int, err error) { return Fprintf(os.Stdout, format, a...) } ``` 2. 结构体长度为0,导致变量使用全局变量地址 ``` func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer { ... if size == 0 { return unsafe.Pointer(&zerobase) } ... } // base address for all 0-byte allocations var zerobase uintptr ```

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧