首页 > 其他分享 >【C语言】指针

【C语言】指针

时间:2024-05-26 19:35:09浏览次数:22  
标签:程序 C语言 assert 访问 地址 NULL 指针

一:野指针

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

1、野指针成因

(1)指针未初始化

(2)指针越界访问

(3)指针指向的空间释放

2、如何避免野指针

(1)指针初始化

如果明确知道指针指向哪里就直接赋地址,如果不知道指针应该指向哪里,可以给指针赋值NULL.

NULL是C语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法直接使用的,读写该地址会报错。

初始化如下:

从上面的异常可以看出,指针变量被赋值为NULL时,改地址是不能读写的。

(2)小心指针越界

一个程序向内存申请了哪些空间,通过指针也就能访问哪些空间,不能超出范围访问,超出了就是越界访问。

(3)指针变量不再使用时,及时赋值为NULL,指针使用之前检查有效性

当指针变量指向一块区域的时候,我们可以通过指针访问该区域,后期不再使用这个指针访问空间的时候,我们可以把该指针赋值为NULL。因为约定俗称的一个规则是:只要是NULL指针就不去访问,同时使用指针之前可以判断指针是否是NULL。

(4)避免返回局部变量的地址

如造成野指针的第三个例子,不要在调用函数的时候返回局部变量的地址。

二:assert断言

注意:使用assert断言的时候,一定要包含头文件:#include<assert.h>

assert.h头文件定义了宏assert(),用于在运行时确保程序符合指定条件,如果不符合,就报错终止运行。这个宏常常被称为“断言”。

这行代码在程序运行到这一行语句时,验证指针变量p是否等于NULL。如果不等于NULL,程序继续执行,否则就会终止运行,并且给出报错信息提示。

assert()宏接受一个表达式作为参数。如果该表达式为真(返回值非零),assert()不会产生任何作用,程序继续运行。如果该表达式为假(返回值为零),assert()就会报错,在屏幕上写入一条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号。

例如:

assert()的的使用对程序员时非常友好的,使用asser()有以下几个好处:

它不仅能自动标识文件和出问题的行号,还有一种无需更改代码就能开启和关闭assert()的机制。如果已经确认程序没有问题,不需要再做断言,就在#include<assert.h>的前面,定义一个宏NDEBUG.

例如:

然后,重新编译程序,编译器就会禁⽤⽂件中所有的 assert() 语句。如果程序⼜出现问题,可以移 除这条 #define NDBUG 指令(或者把它注释掉),再次编译,这样就重新启⽤了 assert() 语 句。 assert() 的缺点是,因为引⼊了额外的检查,增加了程序的运⾏时间。 ⼀般我们可以在 Debug 中使⽤,在 Release 版本中选择禁⽤ assert 就⾏,在 VS 这样的集成开 发环境中,在 Release 版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题, 在 Release 版本不影响⽤⼾使⽤时程序的效率。

标签:程序,C语言,assert,访问,地址,NULL,指针
From: https://blog.csdn.net/hefaxiang/article/details/139213413

相关文章

  • 轻松拿捏C语言——【字符串函数】的使用及模拟实现
    ......
  • C语言之指针详解(2)
    文章目录一、数组名的理解二、使用指针访问数组三、一维数组传参的本质四、二级指针五、指针数组六、指针数组模拟二维数组经过了上一讲的《C语言之指针详解(1)》的学习后,我想大家对于指针已经有了一定程度的了解,这章我们将继续学习C语言。这章主要讲的是数组与指针之......
  • C语言之指针详解(1)
    文章目录一、内存和地址1.内存2.地址3.如何理解编址二、指针变量和地址1.取地址操作符(&)2.指针变量和解引用操作符(*)2.1指针变量2.2如何理解指针类型2.3解引用操作符3.指针变量的大小三、指针变量类型的意义1.指针的解引用2.指针加减整数3.void*指针四、c......
  • c语言程序实验————实验报告十一
    c语言程序实验————实验报告十一实验项目名称:实验报告11指针的基本使用实验项目类型:验证性实验日期:2024年5月23日一、实验目的1.掌握指针变量的定义格式,会定义和使用指针变量2.能正确建立指针变量与数组(包括一维、两维和字符串数组)的联系,并正确使用指针变量访问......
  • strcat函数及其模拟实现(C语言)
    1.前言C语言中的库函数有很多,有关于处理字符串的函数有很多。在本文中,我将为大家介绍处理字符串较为常用的一个函数——strcat函数希望读者们能够好好看,大家一起进步!......
  • 指针的入门
    听课笔记#include<stdio.h>intmain(){ intnum=1; //定义了一个指针变量,指针 //说明 //1:int*表示类型为指针类型 //2:名称ptr,ptr就是一个int*类型 //3:ptr指向了一个int类型的变量的地址 int*ptr=&num; //num的地址是多少 //说明1:如果要输出一个变量的地址,使用......
  • c语言程序实验————实验报告十
    c语言程序实验————实验报告十实验项目名称:实验报告10函数的调用实验项目类型:验证性实验日期:2024年5月20日一、实验目的1.掌握定义函数的方法2.掌握函数调用、实参与形参的对应关系、参数的传递方式3.掌握函数的嵌套调用和递归调用的方法4.掌握全局变量和局部......
  • C语言操作符详解
    文章目录一、操作符分类二、二进制和进制转换1、各种进制的区别2、二进制转十进制3、二进制转八进制和十六进制三、原码、反码、补码四、移位操作符1、左移操作符2、右移操作符五、位操作符。1、按位与&2、按位或|3、按位异或^4、按位取反~六、单目操作符1、!非运......
  • 数据结构与算法学习(06)查找(3)Trie树(C语言)——BUAA
    文章目录查找(3)——Trie树(C语言)介绍结构实现典型应用(字典树)代码实现优势查找(3)——Trie树(C语言)介绍本文为查找第三部分,主要是整理了本人上课时讲的内容,并给出了C语言代码实现结构实现键值由固定的字符序列组成(如数字或字母),如Huffman码、英文单词;对应结点的分层标记......
  • 【C++函数指针】
    voidf(stringname){ cout<<"f()->mynameis:"<<name<<endl;}intmain(){ f("1"); autoi=f; i("2");}鼠标放在i上面可以看到类型,所以还可以这样: void(*j)(string)=f; j("2"); typedefvoid(*m)(st......