C语言NULL指针和动态内存分配释放练习1

执行结果截图:

C语言NULL指针和动态内存分配释放练习1

 C语言NULL指针和动态内存分配释放练习1

 

 代码:

#include <stddef.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>

void testNULLPointer() {
//整型指针p1未被初始化,是个野指针
int * p1;
int num = 1024;
int * p2 = &num;
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、指针操作超越了变量的作用范围。这种情况让人防不胜防。
*/
上一篇:《C语言深度剖析》第四章 指针和数组 p3 C语言从入门到入土(进阶篇)


下一篇:C# 运行时替换方法(需要unsafe编译)