《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放在哪个位置就是修饰谁的。 

 

posted @ 2020-11-03 08:31  xuxianshen  阅读(70)  评论(0编辑  收藏  举报