【C语言】使用指针时出现的各种错误总结以及处理方法 您所在的位置:网站首页 运行时错误怎么解决c语言 【C语言】使用指针时出现的各种错误总结以及处理方法

【C语言】使用指针时出现的各种错误总结以及处理方法

2024-07-02 02:32| 来源: 网络整理| 查看: 265

🏖️作者:@malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 在这里插入图片描述

目录 前言一、什么是野指针二、野指针出现的成因2.1 指针未进行初始化2.2 指针越界访问2.3 指针指向已经被释放的空间2.4 return返回局部/临时变量的地址 三、常见的动态内存分配错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free释放3.4 使用free释放一块动态开辟内存的一部分3.5 对同一块动态内存多次释放3.6 动态开辟内存忘记释放(内存泄漏)3.7 几个经典的动态内存分配题 四、如何规避野指针以及动态内存分配时出现的各种错误

前言

今天我们要来谈论的是使用指针会出现的各种错误以及如何规避错误的方法,其实呢大家也可以看到关于指针部分我也是花了很多功夫给大家进行讲解总结,由此可见指针的重要性,它也是我们即将学习数据结构的基石,,可以说指针没学好那么你数据结构一定是学不明白的,所以这里强烈建议大家把基础打扎实了再进行下一阶段的学习。

一、什么是野指针

概念:野指针就是指针指向的位置是不可预知的(随机的、不正确的、没有明确限制的)。

对于这个概念我们来看看一个形象的比喻:野指针是十分危险的,我们之前把它比作野狗,野狗是没有主人的,所以它随时可能对路人造成危险到处咬人,那该怎么去解决这个问题呢?最好的办法是限制它的行动嘛,就用一根铁链栓住这条野狗,这样就大概率不会出现咬人的风险了。

二、野指针出现的成因 2.1 指针未进行初始化

我们来简单的看一个例子:

#include int main() { int* p; *p = 20; printf("%d\n",*p); return 0; }

大家觉得会打印出什么结果呢?我们一起来看看:

在这里插入图片描述

为什么编译器也会给我们直接就报错了呢?下面我们来分析一下:

首先我们知道局部变量未进行初始化,默认是随机值;那么指针未进行初始化是不是也默认为随机地址,但是你也不知道到底是哪块地址,属不属于这个程序的地址,然后随便通过地址找到了这块内容并且将20给它放进去,这样可能就造成了非法访问内存,所以编译器是不允许这种行为的。

下面再给大家分享一道选择题: 在这里插入图片描述

这道题最主要考的就是指针初始化/赋值的问题,你注意到这个问题了,那么这道题可以直接就选出来了,答案是选D,下面我们简单的分析一下:

选项D,因为指针变量p没有进行初始化,所以指针变量p指向的地址是不确定的,那么scanf(在窗口输入内容)就不能随便对这块空间相当于进行赋值操作,而有的读者又问了,你这是不是由于没加&地址符而导致的呢?我们继续来想一下,&p就是指针变量的地址对吧,那么scanf往这块地址里面输入的内容是不是就是地址(指针)呢?因为指针变量p的内容就是地址(指针)嘛,但是输入的内容(地址)你怎么确定它就是该程序内的地址呢?是你有权限使用的地址呢?所以对于指针变量来说一定要进行初始化/赋值操作,scanf才能往指针变量所指向的地址空间内输入内容,,所以其实大家也可以发现scanf本质上是对指针变量所指向的地址空间进行赋值操作,而不是直接对指针变量进行赋值操作!!

下面还是举个简单的例子让大家明白清楚这个过程,大家先想一想这个过程实际上是在干嘛呢?打印出来的结果取决于什么?又或者是一个错误的程序呢?

#include int main() { int a = 10; int* p = &a; scanf("%d", p); printf("a = %d\n", a); printf("*p = %d\n", *p); return 0; }

下面我画个图向大家简单描述一下这个过程:

在这里插入图片描述

我们来看看答案:

在这里插入图片描述

2.2 指针越界访问 #include int main() { int arr[10]={0}; int* p = arr; for(int i = 0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有