野指针的产生与避免

219 阅读2分钟

当我们在使用指针时,有时会产生指针指向未知的情况,此时这种指针就被称为野指针 野指针的成因有许多,通常都是书写不规范导致的。 例如在使用指针时未进行初始化,如下代码

#include<stdio.h>
int main(){
int *p;
printf("%d",*p);
return 0;
}

此时的输出结果为

屏幕截图 2024-10-22 085405.png

在出现这类问题时,我们要注意一定要对指针进行初始化,如下所示

int *p=NULL;
//int *p=0;

以上两种定义方式都可以,这就对指针进行了初始化,使其指向0,这种指针称为空指针 所以当我们新定义一个指针时一定要初始化,避免产生野指针。 另外,指针也如同数组一般存在越界问题,产生这类问题时,编译器时是不会报错的,但这种书写方式是错误的 例如声明一个数组为arr[10];而指针p=&arr[10]是错误的,如下代码

int arr[10];
int *p=&arr[10];

在数组中,角标是从0开始的,因此该数组角标的最大值为9,所以指针指向10也是错误的,产生了指针越界,这样被称为野指针 虽然最后编译器不报错且会输出一个地址,但它指向的不是这个数组了,而是其他数,因此在使用指针指向数组时,一定要注意数组角标的最大值为n-1;避免产生野指针。 当指针指向已被释放的空间,此时的指针也是野指针 在main函数中可以这样释放空间

int *test(){
int a=10;
return &a;}//返回a的地址

此时释放空间后无法打出数值,打出的数值时空白的

int *p=test();
printf("%d\n",*p):

所以当指针指向空间释放时,要及时置NULL。 且在打出地址时,要检查指针的有效性,如果为NULL值不要打出,让其指向一个你需要的地址之后在输出, 时指针不为NULL值。 在使用指针时,不要指向局部变量,在子函数中的变量不能带到主函数中,如下代码

#include<stdio.h>
int test(int a){
a=10;
return 0;}
int main(){
int *p=&a;
return 0;}

此时在main函数中未声明变量a,此时的编译器就会报错,a在test函数中进行声明,那它就是test函数中的局部变量,不可以在main函数中直接使用0.