为了账号安全,请及时绑定邮箱和手机立即绑定

为什么地址大小不同?(0x206a10 - 0x104382e0)

为什么地址大小不同?(0x206a10 - 0x104382e0)

Go
倚天杖 2021-12-07 16:05:39
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 个十六进制数字。这是因为那些ints(由 返回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但是即使ij将“小于”4 个字节(例如int16),这也将始终填充为 8 位,因此此填充不会告诉您它们是否具有不同的大小。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信