http://play.golang.org/p/BgnHN-GikUvar p1 = new(int)var p2 *int = new(int)var p3 = 0var p4 *intfunc main() { fmt.Println(*p1, &p1, p1) fmt.Println() fmt.Println(*p2, &p2, p2) fmt.Println() fmt.Println(p3, &p3) fmt.Println() fmt.Println(p4, &p4)}0 0x206a10 0x104382e00 0x206a14 0x104382f00 0x21ccc0<nil> 0x206a18
1 回答
qq_花开花谢_0
TA贡献1835条经验 获得超7个赞
不同的不是地址大小,而是打印时十六进制表示的大小(长度)。
您在 Go Playground 上打印的所有地址都是 4 个字节,但如果第一个字节(或位)为零,则不会打印它们。
此外,如果您仔细观察,您的全局变量的地址有 6 个十六进制数字,分配和返回的指针new()
有 8 个十六进制数字。这是因为那些int
s(由 返回new()
)被分配在具有更大偏移量(因此“更大”的内存地址)的堆上。
例如:
var i, j int32 = 123, 123000 fmt.Printf("%x %x\n", i, j)
7b 1e078
即使两个数字都是 4 字节长(32 位),也会打印。您可以使用格式字符串来添加 padding ,0
如下所示:
fmt.Printf("%08x %08x\n", i, j)
这会导致0000007b 0001e078
但是即使i
或j
将“小于”4 个字节(例如int16
),这也将始终填充为 8 位,因此此填充不会告诉您它们是否具有不同的大小。
- 1 回答
- 0 关注
- 147 浏览
添加回答
举报
0/150
提交
取消