《C语言笔记:指针相关(一)》
一,野指针问题
1,什么是野指针?
野指针就是指针指向了一个不可知的位置(随机的、不正确的、限制访问的)。
2,会造成什么危害?
第一种情况,指向一个不可访问的地址(比如内核空间),会触发段错误,这种算是最好的情况。
第二种情况,指向一个可用的但是没有什么特别意义的空间(比如说曾经使用过但已经不用了的栈空间或堆空间),这个时候程序运行不会出错,也不会对当前程序造成损害,这种情况下会掩盖你的程序,让你以为程序没有错误,其实是有问题的。
第三种情况,指向了一个可用的空间,而且这个空间在程序中正在被使用着(比如说一个变量x),那么野指针的解引用就会刚好修改这个变量的值,导致这个变量被莫名奇妙的改变,使得程序出现离奇的错误。一般最终会导致程序崩溃,或者数据损害。这种危害是最大的。
3,怎样避免野指针?
常规做法:
第一点:定义指针时,同时初始化为NULL。
第二点:在指针解引用前,先判断这个指针是不是为NULL。
第三点:指针使用完后,将其赋值为NULL。
第四点:在指针赋值使用时,确保赋值的是一个可用的地址空间。
二,const关键字和指针
const关键字修饰变量表示这个变量时常量,是只读的,不可也不必修改的。
const修饰局部变量时,并不是真正的不可修改,可以通过“骗过”编译器来修改其值。当修饰全局变量是便是真正不可修改。
当修饰的是全局变量时,编译时编译器将这是被const修饰为常量的变量放在了代码段,之后便真正不可修改。
当修饰的是局部变量时,这个变量是存放在栈中,故而只要“骗过”编译器便仍可以修改其值。
#include<stdio.h> const int b = 20; int main() { const int a = 10; int *p = &a; int *q = &b; printf("before a = %d\n ",a); //10 *p = 12; printf("after a = %d \n",a); //12 printf("before b = %d \n",b); //20 *q = 22; // 段错误 printf("after b = %d \n",b); }
const修饰指针的4种形式。
第一种:const int *p,指针指向的变量不可修改。
第二种:int const *p,同第一种指针指向的变量不可修改。
第三种:int * const p,指针不可修改。
第四种:const int * const p,指针变量本身和指针指向的变量都不可修改。
关于指针变量的理解,主要涉及到两个变量:第一个是指针变量本身(P),第二个是指针P指向的那个变量(*P)。一个const只能修饰一个变量,所以弄清这四种形式的关键就是搞清楚const放在哪个位置就是修饰谁的。