ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-12-22 16:33:54  阅读:148  来源: 互联网

标签:初始化 p1 p3 C语言 动态内存 printf NULL 指针


执行结果截图:

 

 

 代码:

#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、指针操作超越了变量的作用范围。这种情况让人防不胜防。
*/

标签:初始化,p1,p3,C语言,动态内存,printf,NULL,指针
来源: https://www.cnblogs.com/johnnyH/p/15720079.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有