为什么分配指针导致恐慌

时间:2017-07-21 21:54:49

标签: go

我有以下代码:

type box struct {
    val int
}

var p *box

这很好用:

p = &box{val: 2}

但这会导致错误:

*p = box{val: 2}

错误:

panic: runtime error: invalid memory address or nil pointer dereference 
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x5e59d9]

为什么第二种分配形式导致恐慌?

2 个答案:

答案 0 :(得分:3)

因为p指向任何内容(nil)。您必须首先分配一些内存并使p指向它,然后才允许尊重p。您可以使用new内置函数将初始化的内存分配给指向类型的零值。

p = &box{val: 2}

的结果与:

相同
p = new(box)
*p = box{val: 2}

答案 1 :(得分:2)

因为指针没有指向任何东西。它的值为null。如果它指向某个东西,那么你可以尝试改变被指向的东西。

p = &box{val: 2} 

在此语句之前,p = nil,在此语句之后,p =某个内存地址。

*p = box{val: 2} 

在此声明之前,如果p = nil,您将收到错误,因为您正在尝试设置存储在变量p中的地址的值。它基本上试图从零地址获得一些东西。

如果你这样做了:

p = &box{val: 2}
*p = some new value

它可以正常工作,因为p已指向某个地址,您可以更改该地址的值。