Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference

EricJonse · · 2706 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

指针基础知识

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

摘抄自:https://blog.csdn.net/qq_36431213/article/details/82967982


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2706 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传