猿问

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

http://play.golang.org/p/BgnHN-GikU


var p1 = new(int)

var p2 *int = new(int)

var p3 = 0

var p4 *int


func 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 0x104382e0


0 0x206a14 0x104382f0


0 0x21ccc0


<nil> 0x206a18


倚天杖
浏览 148回答 1
1回答

qq_花开花谢_0

不同的不是地址大小,而是打印时十六进制表示的大小(长度)。您在 Go Playground 上打印的所有地址都是 4 个字节,但如果第一个字节(或位)为零,则不会打印它们。此外,如果您仔细观察,您的全局变量的地址有 6 个十六进制数字,分配和返回的指针new()有 8 个十六进制数字。这是因为那些ints(由 返回new())被分配在具有更大偏移量(因此“更大”的内存地址)的堆上。例如:var&nbsp;i,&nbsp;j&nbsp;int32&nbsp;=&nbsp;123,&nbsp;123000 fmt.Printf("%x&nbsp;%x\n",&nbsp;i,&nbsp;j)7b 1e078即使两个数字都是 4 字节长(32 位),也会打印。您可以使用格式字符串来添加 padding ,0如下所示:fmt.Printf("%08x&nbsp;%08x\n",&nbsp;i,&nbsp;j)这会导致0000007b 0001e078但是即使i或j将“小于”4 个字节(例如int16),这也将始终填充为 8 位,因此此填充不会告诉您它们是否具有不同的大小。
随时随地看视频慕课网APP

相关分类

Go
我要回答