首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言如何规避野指针

一、概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的) 二、野指针成因: 2.1. 指针未初始化 1....test(); printf("%d\n", *p); return 0; } 三、如何规避野指针 3.1 指针初始化 如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪里...NULL 是C语言中定义的⼀个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错。...,及时置NULL,指针使用之前检查有效性 当指针变量指向一块区域的时候,我们可以通过指针访问该区域,后期不再使这用个指针访问空间的时候,我们可以把该指针置为NULL。...因为约定俗成的⼀个规则就是:只要是NULL指针就不去访问,同时使用指针之前可以判断指针是否为NULL。

13510

C语言指针(野指针)

2:如何规避野指针 1.1:指针变量的初始化 2.2:指针越界访问 3.3:指针指向的空间如果我们还回去的话,就把指针指针置为NULL  4.4:指针使用之前检查有效性 1:什么是野指针?...指针越界也会导致野指针问题,这里解释下:就是当你指针指向的范围超过数组名范围时,那么那个指针就是野指针了。...2:如何规避野指针 1.1:指针变量的初始化 int a = 10; int* pa = &a; //指针变量的初始化 指针常见错误 引用未初始化的指针变量 试图引用未初始化的指针变量是初学者最容易犯的错误...程序通常使用空指针来表示条件,例如未知长度列表的结尾或未执行某些操作; 这种空指针的使用可以与可空类型和选项类型中的Nothing值进行比较。...空指针不应与未初始化的指针混淆:保证空指针与指向有效对象的任何指针进行比较。但是,根据语言和实现,未初始化的指针可能没有任何此类保证。它可能与其他有效指针相等; 或者它可能比较等于空指针

2.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C - 指针C语言指针的总结

    C语言指针的总结 1. 变量 不同类型的变量在内存中占据不同的字节空间。 内存中存储数据的最小基本单位是字节,每一个字节都有一个内存地址,这个地址是一个十六进制的数。...如何取出变量的地址:使用&(取地址运算符)运算符,&变量名;这个表达式的值就是这个变量的地址。使用%p控制度输出变量的地址。 什么是指针:变量的地址叫做指针指针就是地址,地址就是指针。...指针 指针C语言的灵魂。指针变量占据8个字节。 变量在内存中的存储。 变量的值:存储在变量中的数据,叫做变量的值。 变量的地址:组成这个变量的低字节的地址,就是这个变量的地址。...如何声明一个专门用来存储地址的指针变量 数据类型 * 指针变量的名称 --- int * p1; 指针变量的名字叫做p1,这个指针变量的类型是int* 读作int指针。...指针指针在之间的比较运算 , >=, ==, !=都可以使用 可以用来判断两个指针指向的变量的字节,谁在高字节,谁在低字节。或者两个指针的地址是不是同一个地址。

    4.2K81

    C语言指针

    二、指针的定义 三、指针的初始化 四、指针运算符 五、指针的用途举例 六、关于指针的疑问 指针C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。...究竟什么是指针呢?我们先来看一个概念。 回到顶部 直接引用 1. 回想一下,之前我们是如何更改某个变量的值? 我们之前是通过变量名来直接引用变量,然后进行赋值: char a; a = 10; 2....1.我们已经知道,"直接引用"是直接通过变量名来读写变量 2.C语言中还有一种"间接引用"的方式(以变量a为例):首先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a...* 看下面的代码,利用指针p读取变量c的值 1 int i = 2; 2 char c = 1; 3 4 // 定义一个指向char类型的指针 5 char *p = &c; 6 7 // 取出 8...这个要根据内存来分析 根据变量的定义顺序,这些变量在内存中大致如下图排布: 其中,指针变量p和int类型变量i各占2个字节,char类型的c占一个字节,p指向c,因此p值就是c的地址 ?

    3.3K60

    c语言如何利用指针间接赋值

    我们都知道,指针是指向一段内存空间的。而这个内存空间也可以存放下一个内存空间的地址,这样一级级的传递下去,就变成了多级指针。在C语言中,多级指针是经常会用到的。 多级指针像一把双刃剑,有利也有弊。...你能够通过n级指针去修改n-1级指针的内容,甚至直接修改指针所指向的内存空间 例如: 你在main函数里面声明了一个字符串指针,然后你想通过调用一个外部函数来修改它。...这个时候,你就可以将这个字符串指针的地址传递给函数。这样,函数的参数就是一个二级指针了,通过这个二级指针,你可以很方便的修改字符串的内容。...s=45051 C语言控制led灯 http://www.makeru.com.cn/live/1392_304.html?...s=45051 如何编写生活中的C语言 http://www.makeru.com.cn/live/5413_2649.html?s=45051

    2K10

    C语言——指针

    目录 指针是什么? 指针变量 使用指针变量的例子 通过指针引用数组 &数组名vs数组名 野指针指针成因 如何避免野指针 指针运算 指针是什么?...指针c语言中的一个重要概念,也是C语言的一个重要的特色,正确而灵活地运用它,可以使程序简洁,紧凑,高效,每一个学习和使用c语言的人,都应当深入了解地学习和掌握指针,可以说,不掌握指针就是没有掌握C的精华也可以说...指针C语言的灵魂(doge) 由于通过地址能找到所需的变量单元,可以说,地址指向变量单元,打个比方,一个房间的门口挂了一个房间号2008,这个2008就是房间的地址,或者说,2008"指向"...野指针 概念:野指针就是指针指向的位置是不可知的,(随机性的丶不正确的丶没有明确限制的) 野指针成因 1.指针未初始化 2.指针越界访问  如何避免野指针 1.指针初始化 2.小心指针越界...16进制的C的10进制是12,所以q+1和q相差4  p是整型指针相当于sizeof(int)=4 q是字符型指针相当于sizeof(char)=1; 以上就是我归纳指针的一些小结 如果能帮助友友们 -

    2.3K20

    C语言_初识C语言指针

    为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址 编号 = 地址 = 指针 指针变量 = 变量 = 存放地址的变量 ---- 一、指针 … 一个内存单元多大比较合适...存放一个二进制位 Byte Byte = 8bit KB 1KB = 1024 Byte MB 1MB = 1024 KB GB 1024 TB 1024 PB 1024 ---- 二、地址或者编号如何产生.../0 32位机器,上面有32根地址线 2的32次方个字节的空间 - - - 4,294,967,296 Byte — 4GB ---- 通过pa里存放的a的地址找到a ---- 三、指针变量的大小...指针变量是用来存放地址的 32位机器上:地址是32个二进制位,这个地址要存储的话要4个字节,所以在32位机器上,指针变量的大小是4个字节。...64位机器上:地址是64个二进制位,这个地址要存储的话要8个字节,所以在64位机器上,指针变量的大小是8个字节。

    19030

    C语言: 指针

    目录 概念: 指针的类型 指针的解引用 野指针指针的成因 空指针 指针与数组 指针在数组中的使用: 二级指针 ---- 概念: 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址...因此,一个单元大小是一个字节比较合理,能控制的内存为4g左右。同样,64位的机器更大。 所以,一个指针在32位的情况下,我们就得用4个字节大小才能控制到全部的地址。...野指针 概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量 在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一 个地址是不确定的变量...3、指针的空间释放掉了 那么,如何有效的规避野指针呢?...0; } 指针指向的是目标变量的地址,那么二级指针指向的就是指针的地址。

    2K70

    C语言指针

    学习 C 语言指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的。...指针变量就是一种变量, 和其他种类的变量类似, 但指针和其他变量又有区别. 首先C语言作为一种类型语言, 每个变量都会有几个属性. 变量名称. 变量类型. 变量的值....Address stored in ip variable: bffd8b3c Value of *ip variable:20 类型 对于C语言来说, 搞清楚变量的类型相当重要, 涉及到指针的时候就更加重要...这个声明/定义比较复杂, 日常编程可能就会碰到比较 复杂的情况, 所以要搞清楚指针首先要懂得怎么看一个声明/定义的变量的类型. 如果看到一个变量的声明或者定义, 那么就需要弄明白变量的类型....整个来说: next是一个指针, 指向一个函数, 函数的返回值也是一个指针, 指向一个类型为char的常量指针. C语言为类型语言, 即每个变量都有类型.

    2.7K20

    如何深入掌握C语言指针(详解)

    目录 前言 指针是什么 概念 单元大小与编址 指针指针类型 指针类型 指针+-整数 指针的解引用 野指针 指针未初始化 指针越界访问 指针指向的空间释放 如何规避野指针 指针运算 指针+-整数 指针-...指针 指针的关系运算 对于指针比较 指针和数组 二级指针 使用及运算 指针数组 ---- 前言 ---- 本文主要讲解点 指针是什么 指针指针类型 野指针 指针运算 指针和数组 二级指针 指针数组...指针是什么 ---- 概念 专业地说: 指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向 (points to)存在电脑存储器中另一个地方的值 由于通过地址能找到所需的变量单元...return 0; } 如何规避野指针 指针初始化  小心指针越界  指针指向空间释放即使置NULL  避免返回局部变量的地址 指针使用之前检查有效性 指针运算 ---- 指针+-整数 上文已经提及,不再赘述...---- 指针变量也是变量,是变量就有地址 而指针变量的地址存放在二级指针里(指向指针指针) int a =100; int *p1 = &a; int **p2 = &p1;  C语言不限制指针的级数

    60920

    C语言 | 指向指针指针

    “要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人…万中无一” ——包租婆 这道理放在C语言学习上也一并受用。...在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历的是日积月累的学习。 那么如何学习呢?当然是每天都练习一道C语言题目!! ? 作者 闫小林 白天搬砖,晚上做梦。...例82:C语言用指向指针指针的方法对n个整数排序并输出;要求将排序单独写成一个函数;n个整数在主函数中输入,最后在主函数中输出。...C语言源代码演示: #include//头文件 int main()//主函数 { void sort(int **point,int number); //sort排序函数声明...for(i=0;i<number-1;i++) { for(j=i+1;j<number;j++) { if(**(point+i)>**(point+j))//比较之后交换整数地址

    3K32

    C语言指针(三)函数指针

    函数指针 在我们定义函数的时候,编译器也会在内存空间给函数开辟一个内存,而该内存的首地址就是函数的内存地址,而函数指针就是指向该内存地址的。...3.1 函数 众所周知,C语言是面向过程的语言,或者称函数式编程。 而在C语言中,函数也确实起了很大的作用,在C语言的学习中,你见过最多的可能就是main函数,同时也是你第一个见得函数。...我们来看看这个main函数 int main(){return 0;} 我们把他浓缩成一行,比较好瞅 ❝ int是返回类型,每个函数都要有这个,不返回东西的函数的返回值类型为void main是函数名,...; return 是函数结束的关键字,返回值为0表示程序正确运行,为其他表示有其他异常 切记main函数不要void main(){},这个真的很重要 ❞ 3.2 指向函数的指针 见名知意,这个东西也是一个指针...num2); // 定义一个函数,有两个整型参数 funP = sum; // 将函数sum的地址给funP int ans = funP(1, 2); // 使用指针使用函数

    2K00

    C语言C语言数组和指针

    ---- 友情提醒:本文可能是全csdn最详细的指针内容了,希望你能用心读下去 前言 接下来的讲解部分是指针的进阶,包含多种指针以及对应的数组,这部分章节对我们来说很重要,也是c语言中的重点模块儿,重要性不言而喻...(c/c++会把常量字符串储存到单独的一个内存区域中) 当这两个指针指向同一个常量字符串时,实际上就是指向同一块儿地址**(指针就是地址,地址就是指针)** 2.数组指针 2.1数组指针的定义 1.数组指针嘛...这里补充一个小知识点,指针的类型可以决定,指针±整数一次性跳过多少个字节 ,之后再进行解引用操作,就可以拿到相应的元素了 不足之处: 这里有很多人,感觉这样访问数组元素的方法比较智障,我也感觉很智障,...函数 代码4 将函数指针数组的地址放到指向函数指针数组的指针当中,**这里的指针比较难写的,如果直接写不好写的话,我们可以像下面这样,将函数指针数组的数组名替换为(指针)即可 ,这样来写,就不怕我们把这个指针给写错了...print函数的地址,在test函数里面将print函数实现真正的调用,那么这种机制就被称为函数回调的机制,print函数就是回调函数 2.3使用场景三qsort函数: 我们先介绍一下,qsort函数如何使用吧

    64.7K37

    C语言指针进阶

    一、指针变量 指针变量有字符指针变量,数组指针变量和函数指针变量 1、字符指针变量 char* 叫做字符指针 一般这么来使用:通过指针存储指针后解引用访问 int main() { char c =...'a'; char* p = &c; *p = 'a'; return 0; } 另一种使用方式: 将字符串首字符h的地址放入pstr指针当中 int main() { const char...C++会把常量字符串存储到单独的⼀个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。...; } else { printf("请重新输入\n"); } } while (input); return 0; } 四、typedef 关键字讲解 typedef 是C语言中用来重命名的一个关键字...,我们可以早早定义好比较常用的类型,提高工作效率 但是在其使用时,数组指针和函数指针的重命名和上述方法有一些不同: typedef int* p;//正常的普通的指针,定义方法与上述相同 typedef

    6910

    C语言指针)2

    3、指针变量类型的意义 既然指针变量的大小与类型没有关系,那为什么还要有不同的指针类型呢? 在某些情况下,指针类型还是有很大意义的。...3.1指针的解引用 这里来举一个例子探讨指针变量类型的意义。...因为,指针类型决定了对指针解引用的时候有多大的权限,也就是一次能操作几个字节。这就是指针变量类型的意义。...3.3void *类型 在指针类型中有一种特殊的类型是 void * 类型的,为无具体类型的指针(泛型指针),这种类型的指针可以用来接收任意类型的地址。...既然指针的解引用可以间接地去改变const修饰的变量的值,那我们干脆把指针变量也用const修饰,因为指针变量也是变量嘛。

    8910

    C语言指针)5

    值得一说的是,str1、str2、str3、str4比较的都是地址,而不是其中存的值。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,它们实际会指向同一块内存。...9、数组指针 9.1数组指针的创建 前面说了指针数组,这里再来了解一下数组指针。...数组指针如何创建呢?跟其他类型的指针一样,创建之前应该先确定数组指针的类型吧。...我们知道指针的类型取决于它所指对象的类型,比如整型指针指向的是整型所以整型指针的类型为 :int *,字符指针指向的是字符所以字符指针的类型为: char *,那同样的数组指针指向的是数组所以数组指针的类型就应该为...9.2数组指针指向指针数组 说到这里又有一个问题需要我们思考,数组指针是存放数组地址的指针,那指针数组也是数组啊,将指针数组的地址存到数组指针内该如何存呢?

    5910

    C语言——指针(四)

    ; //把‘a’赋值给pc所指向的空间 return 0; } 2,储存字符串 那么字符串又该如何用字符指针来储存呢?...中存放的都是‘h’的地址 对表达式的意义进行理解: 1,**if(str1 == str2)**中,str1代表的是str1数组中首元素的地址,str2代表的是str2数组中首元素的地址,所以,这个表达式比较的是两个数组首元素的地址是否相同...2,**if(str3 == str4)**中,因为str3和str4都是字符指针,是两个变量,所以,这个表达式比较的是两个变量里面的值是否相同 虽然,str1与str2两个字符数组的内容相同,但是两个字符数组所占用的内存是不同的...三,函数指针变量 函数指针变量就是用来存放函数的地址的指针变量 有了函数的地址以后,我们就可以通过地址来调用函数 1,函数的地址 函数有没有地址?...我们做个测试 我们发现:1,函数也是有地址的,可以用 &函数名 来获得,2,函数名表示的是函数的地址 2,创建函数指针 函数指针的写法与数组指针类似,下面进行函数指针创建的展示 void test

    9410

    C语言——指针(三)

    ,因此+1就会一下子跳过整个数组,也就是20个字节(上一讲说到的指针类型会影响指针±整数所跳过的字节数)。...二,指针与一维数组 在前面学习的基础上,我们再来看看数组与指针间的奇妙联系!...void test(int arr[]) 参数上写成数组的形式,本质上还是指针 参数: int arr[] int* arr (形式不同,本质相同) 2,指针访问一维数组 下面举例: 1...)用指针变量和指针运算符 我们可以用指针变量和指针运算符实现访问数组 如下,用指针变量输入输出各数组的元素: int main() { int i, a[5], * p = a; //输入: for...:访问数组中不同地址的元素 ●注意:printf(“%4d”, *p++);中 *p++ 的作用是:先输出指针指向的变量的值,然后指针变量加1

    6910
    领券