解引用NULL会导致挂死?

解引用NULL指针会导致程序挂死,因为访问内存地址为0被视为非法。程序地址空间布局中,0地址既不在堆也不在栈,而是受保护区域。试图访问这些受保护的位置会触发保护机制,使程序崩溃。总结来说,避免访问非法或只读区域,解引用前要检查指针是否为空。
摘要由CSDN通过智能技术生成

来源:公众号【编程珠玑】

作者:守望先生

ID:shouwangxiansheng

 

解引用NULL指针为什么会出错,导致程序挂死?或者说访问内存地址为0的位置为什么会视为非法?

先了解NULL

​参考《NULL,0,'\0'有何区别?》。

解引用NULL

解释问题之前,先描述问题。请看下面的代码:

//来源:公众号【编程珠玑】
//https://www.yanbinghu.com
#include<stdio.h>
int main(void)
{
    char *p = NULL;
    char c = *p;
    return 0;
}

运行:

Segmentation fault

为什么会出现这样的错误呢?解释这个问题之前,先简单了解以下程序地址空间布局。

程序地址空间布局

本文不深入介绍,而仅简单介绍进程的虚拟地址空间(注意下面提到的都不是实际的物理地址),以便帮助我们理解标题的问题。

程序运行起来后,会映射到一个虚拟地址空间。对于32位程序,它是一个4G的大小(一个32位程序,能用到的内存也不过4G)。

其布局如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值