c/c++语言开发共享C语言的空类型指针,空指针,野指针详解

目录空指针-null空类型指针-void*void是空类型,void*是空类型指针,又叫万能指针,就是该指针能接收任意类型的指针,可以指向任何类型对象,所以不能对空类型指针进行解引用,必须强制类型转换

目录
  • 空指针-null

      空类型指针-void*

      void是空类型,void*是空类型指针,又叫万能指针,就是该指针能接收任意类型的指针,可以指向任何类型对象,所以不能对空类型指针进行解引用,必须强制类型转换成相应的指针类型,才能进行解引用操作。

      空指针类型:

      • 作为函数形参类型,可以接收任意类型的指针;
      • 作为函数返回值类型,在函数外面,将其强制类型转换为相应的指针类型
      • 可以与另一个void*类型指针比较大小

      注意:空类型指针不能进行解引用操作;不能进行±整数运算。

      空指针-null

      在c语言中,空指针null指的是地址为0的那块空间

      #define null((void*)0)

      对于这块空间是不准我们进行访问的,所以,对null是不能进行解引用操作的,所以每次对指针进行解引用操作之前,我们要判断是否为空指针。

      野指针

      野指针是指向一个非法的或已销毁的内存的指针。

      对野指针进行解引用操作是非法的。

      造成野指针的原因

      1.指针未初始化

        int main()  {  	char* p;  	//此时p是野指针  	return 0;  }  

      没有对指针p进行初始化,此时p就是野指针,如果此时对p进行解引用操作,非法访问内存,程序就会崩溃。

      2.指针越界访问

        int main()  {  	int arr[] = {1,2,3,4,5};    	int* p = arr;    	int i = 0;  	for (i = 0; i < 10; i++)  	{  		printf("%d ",p[i]);  	}    	return 0;  }  

      虽然上面程序正常运行,但是其实越界访问了;只是仅仅访问了非法的内存空间,没有改变空间的值,程序有可能没来得及报错,但并不代表程序没有错,但是对于下面的代码,程序就会崩溃:

        int main()  {  	int arr[10] = {0};  	int i = 0;  	int* p = arr;    	for (i = 0; i <= 10; i++)  	{  		*p = i;  		p++;  	}    	return 0;  }  

      因为这里非法访问内存的同时试图改变空间的值,所以程序崩溃。

      3.指针指向的空间已经释放

        char* fun()  {  	char arr[] = "abc";  	return arr;  }    int main()  {  	char* p = fun();  	printf("%sn",p);  	return 0;  }  

      执行程序,给出如下警告

      C语言的空类型指针,空指针,野指针详解

      虽然程序没有崩溃,但是这种写法是非法的,arr是局部变量,函数调用结束,栈帧销毁,局部变量空间归还给操作系统,我们没有使用权限,此时p就是野指针,*p属于非法访问内存。

      避免野指针

      1.指针要进行初始化

      指针要有初始值,初始化为null,或者有具体的指向。

      既然null也不能进行解引用操作,那么为什么可以将指针初始化为null?这里初始化为null,只是为了给指针一个指向,但是实际使用时,我们并不能对null进行解引用操作,所以使用指针之前才要有效性判断。

      2.使用指针之前要进行有效性判断

      使用指针之前,要判断是否为null,如果为null,那么是不能进行解引用操作的

      3.避免越界访问

      不要进行越界访问操作,即使还是访问不改变值也是非法的

      4.不要返回局部变量的地址

      局部变量空间在函数到调用结束,就归还给操作系统,如果返回局部变量的地址,函数外面接收该返回值的指针就变成了野指针

      5.当指针指向的空间释放后,要将该指针置为null

      这样避免对野指针解引用操作,同时避免二次释放动态开辟的内存空间

        int main()  {  	int* p = (int*)malloc(10*sizeof(int));  	  	//1.判断有效性  	if (p == null)  	{  		return -1;  	}  	  	//2.使用指针  	int i = 0;  	for (i = 0; i < 10; i++)  	{  		p[i] = i;  	}  	  	//3.释放指针指向的空间  	free(p);    	//free(p);//非法操作  	//4.指针置为null  	p = null;    	free(p);//释放空指针什么都不做    	return 0;  }  

      总结

      本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注<计算机技术网(www.ctvol.com)!!>的更多内容!

      需要了解更多c/c++开发分享C语言的空类型指针,空指针,野指针详解,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/834269.html

      (0)
      上一篇 2021年9月23日
      下一篇 2021年9月23日

      精彩推荐