Go 指針聲明后賦值,出現 panic: 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)
}

 

————————————————
版權聲明:本文為CSDN博主「上官二狗」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_36431213/article/details/82967982


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM