runtime error: invalid memory address or nil pointer dereference
阿新 • • 發佈:2021-07-26
指標基礎知識
package main import "fmt" func main() { var p *int p = new(int) *p = 1 fmt.Println(p, &p, *p) }
輸出
0xc04204a080 0xc042068018 1
在 Go 中 * 代表取指標地址中存的值,& 代表取一個值的地址
對於指標,我們一定要明白指標儲存的是一個值的地址,但本身這個指標也需要地址來儲存
如上 p 是一個指標,他的值為記憶體地址 0xc04204a080
而 p 的記憶體地址為 0xc042068018
記憶體地址 0xc04204a080 儲存的值為 1
地址 0xc042068018 0xc04204a080
值 0xc04204a080 1
錯誤例項
在 golang 中如果我們定義一個指標並像普通變數那樣給他賦值,例如下方的程式碼
package main import "fmt" func main() { var i *int *i = 1 fmt.Println(i, &i, *i) }
就會報這樣的一個錯誤
panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x1 addr=0x0 pc=0x498025]
報這個錯的原因是 go 初始化指標的時候會為指標 i 的值賦為 nil ,但 i 的值代表的是 *i 的地址, nil 的話系統還並沒有給 *i 分配地址,所以這時給 *i 賦值肯定會出錯
解決這個問題非常簡單,在給指標賦值前可以先建立一塊記憶體分配給賦值物件即可
package main import "fmt" func main() { var i *int i = new(int) *i = 1 fmt.Println(i, &i, *i) }
結束!