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

时间:2016-01-26 03:46:52

标签: go

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

1 个答案:

答案 0 :(得分:6)

不是地址大小有什么不同,它是您打印时十六进制表示的大小(长度)。

您在Go Playground上打印的所有地址都是4个字节,但如果第一个字节(或位)为零,则不会打印它们。

此外,如果仔细观察,全局变量的地址有6个六位数,new()分配和返回的指针有8个六位数。这是因为那些int s(由new()返回)在堆上分配了更大的偏移量(因此&#34;更大的&#34;内存地址)。

例如:

var i, j int32 = 123, 123000
fmt.Printf("%x %x\n", i, j)

打印7b 1e078,即使两个数字都是4个字节长(32位)。您可以使用格式字符串添加填充0,如下所示:

fmt.Printf("%08x %08x\n", i, j)

这导致0000007b 0001e078,但即使ij为&#34;较少&#34;超过4个字节(例如int16),因此这个填充不会告诉您它们是否具有不同的大小。