执行结果截图:
代码:
#include <stddef.h> #include <stdio.h> #include <malloc.h> #include <string.h> void testNULLPointer() { //整型指针p1未被初始化,是个野指针 int * p1; int num = 1024; int * p2 = # int * p3 = NULL; // 野指针p1访问的是垃圾内存地址, // 对野指针解引用会得到错误的值,并且程序很可能不报错 // 先判断指针是否初始化为NULL,如果没有就提示 if (NULL != p1) { printf("Warning:指针p1当前值不是NULL,解引用前请留意是否是野指针!\n"); printf("p1:\n* p1:%d\n", p1, * p1); } else { printf("Warning:指针p1当前值已经初始化为NULL,不能被解引用!\n"); } // 给整型指针p1分配动态内存空间 // 用sizeof(int)是为了确保跨平台,分配适合该平台的int类型空间 p1 = malloc(sizeof(int)); // 判断指针p1是否已被正确的分配了空间 if(NULL == p1) { printf("malloc error!\n"); //跳出整个程序 exit(1); }else { printf("指针p1已经被分配了动态内存空间\n"); printf("指针p1所在的动态内存空间被初始化前~~\np1:%p\n* p1:%d\n", p1, * p1); //将指针p1所在的动态内存空间都初始化为0 memset(p1,0,sizeof(int)); printf("指针p1所在的动态内存空间已被初始化!\np1:%p\n* p1:%d\n", p1, * p1); * p1 = num; printf("指针p1正在参与运算...\np1:%p\n* p1:%d\n", p1, * p1); free(p1); printf("指针p1所在的动态内存空间已释放!\np1:%p\n* p1:%d\n", p1, * p1); //把p1初始化为NULL if(NULL!= p1) { p1 = NULL; printf("指针p1的值不是NULL,现在初始化为NULL,请不要对NULL值用 * 解引用!\np1:%p\n", p1); }else { printf("Warning:指针p1当前值已经初始化为NULL,不能被解引用!\n"); } } // p1被初始化为NULL后,语句中一用到p1就会报错。 // 如果释放内存后指针p1没有NULL,那么很可能就会忘记初始化从而造成野指针 // 这个报错有利于提醒编程者把p1指向一个有效的正确的地址而不是成为野指针 p1 = p2; if (NULL != p2) { printf("Warning:指针p2当前值不是NULL,解引用前请留意是否是野指针!\n"); printf("p2:%p\n* p2:%d\n", p2, * p2); } else { printf("Warning:指针p2当前值已经初始化为NULL,不能被解引用!\n"); } // 如果把p3 = p1;前面加双斜杠注释符(也就是不执行p3 = p1;语句) // 那么后面执行对p3是否NULL的判断可以得到另一个提示 p3 = p1; if (NULL != p3) { printf("Warning:指针p3当前值不是NULL,解引用前请留意是否是野指针!\n"); printf("p3:%p\n* p3:%d\n", p3, * p3); } else { printf("Warning:p3当前值已经初始化为NULL,不能被解引用!\n"); } /* 当在不知道指针初始化为什么地址的时候,将它初始化为NULL, * 在对指针进行解引用时,先判断是否为NULL, * 例如int * p = NULL; * ...经过分配动态内存和一些运算...特别是用free或delete释放了内存之后 * 用if(p != NULL)对野指针进行判断,并及时把野指针p初始化为NULL * 通过把指针初始化为NULL和检查是否NULL,可以一定程度上防止野指针造成危害 * * 当指针为NULL时,对指针解引用会报错的原因: * NULL指针分配的分区:其范围是从 0x00000000到0x0000FFFF。 * 这段空间是空闲的,对于空闲的空间而言,没有相应的物理存储器与之相对应, * 所以对这段空间来说,任何读写操作都会引起异常。 * * 野指针的的成因: * 1、指针变量没有被初始化。默认值是随机的,它会乱指一气。 * 2、指针p被free或者delete之后,指针成为野指针,没有置为NULL,让人误以为p是个合法的指针。 * 3、指针操作超越了变量的作用范围。这种情况让人防不胜防。 */