我有以下代码:
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]
为什么第二种分配形式导致恐慌?
答案 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已指向某个地址,您可以更改该地址的值。