zoukankan      html  css  js  c++  java
  • 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)
    }

    结束!

  • 相关阅读:
    数组
    数据结构的三个方面
    java数据结构和算法
    HashMap实现原理
    面试必问---HashMap原理分析
    Java中:>>>和>>区别
    java运算符 与(&)、非(~)、或(|)、异或(^)
    Java集合详解(全)
    String、StringBuffer、StringBuilder的区别
    abstract关键字、final关键字、static关键字、访问修饰符详解
  • 原文地址:https://www.cnblogs.com/aaronthon/p/15029078.html
Copyright © 2011-2022 走看看