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)
}
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)
}
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]
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)
}
package main import "fmt" func main() { var i *int i = new(int) *i = 1 fmt.Println(i, &i, *i) }

结束!

指针基础知识 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) } 结束!
经验分享 程序员 微信小程序 职场和发展