1. 程式人生 > 其它 >runtime error: invalid memory address or nil pointer dereference

runtime error: invalid memory address or nil pointer dereference

指標基礎知識

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)
}

結束!