### 由 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
请高手指教下,为什么会出现这种情况
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
```
#1
更多评论
<a href="/user/yigenshutiao" title="@yigenshutiao">@yigenshutiao</a> 受教了 非常感谢
#2