C/C++教程

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语言NULL指针和动态内存分配释放练习1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!