首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C 语言】二级指针案例 ( 多级指针内存释放问题 | 多级指针避免野指针 )

文章目录 一、多级指针内存释放 1、多级指针内存释放 ( 执行顺利的情况 ) 2、分配内存出错处理情况 二、完整代码示例 一、多级指针内存释放 ---- 1、多级指针内存释放 ( 执行顺利的情况 )...释放 n 级指针 , 如果执行顺利 , 正常释放该 n 级指针 , 需要按照如下规则进行释放 : 先释放 1 级指针 , 释放完毕后 , 将释放指针设置为 NULL ; 再释放 2 级指针..., 释放完毕后 , 将释放指针设置为 NULL ; 然后释放 3 级指针 , 释放完毕后 , 将释放指针设置为 NULL ; \vdots 最终释放 n 级指针 , 释放完毕后 , 将释放指针设置为...NULL ; 先释放 低级指针 , 然后逐级提高释放指针 的 层级 , 最后释放 高级指针 ; 如果先把 高级指针 释放了 , 则找不到低级指针 ; 代码示例 : /** * @brief free_memory...} // 先释放 二级指针 指向的 一级指针 内存 for (i=0; i < count; i++) { // 如果 一级指针 不为空才释放

2.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    理解对C++裸指针释放后重用的问题

    本文将以Android 2.2-2.3上的一个zergRush漏洞为例,分析指针释放后重用的问题。 zergRush是Android 2.2-2.3上的一个漏洞,主要问题就在于指针释放后重用。...程序从套接字收到的消息中出抽取出的文本命令会导致栈缓冲区溢出,进而造成释放后重用问题。...---- 什么是释放后重用 释放后重用(Use After Free)问题是指,程序使用指针访问了一个已经通过free函数或者delete操作符释放过的对象,并且这个指针没有置空,攻击者在这块释放后的内存中写入了恶意的数据...前15个参数的处理过程中,argv数组中的元素都是正常的从strdup返回的指向堆的指针值,即指向参数字符串的指针。...char* strdup(const char *s1)函数会为s1指针指向的字符串数据分配等大小的内存,并返回指向这块内存的指针

    1.7K90

    【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一、结构体中嵌套一级指针 1、声明 结构体类型 2、为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3、释放结构体内存 ( 释放内存时先释放 指针成员内存...然后再释放结构头内存 ) 二、完整代码示例 一、结构体中嵌套一级指针 ---- 1、声明 结构体类型 声明 结构体类型 : 这里注意 , 在结构体中 , 定义一个 一级指针 变量 , 注意与 数组类型区别...; 结构体内定义数组 , 声明变量时 , 会自动分配数组内存 ; 结构体内定义指针 , 声明变量时 , 只会为 4 字节指针分配内存 ; /** * @brief The Student struct...( 释放内存时先释放 指针成员内存 然后再释放结构头内存 ) 释放结构体内存 : 释放 结构体 内存时 , 要先释放 结构体变量 的 一级指针 成员的内存 , 然后再释放整个 结构体的 内存 ; /*...结构体内存 free(*array); // 指针置空 , 防止野指针 *array = NULL; return ret; } 二、完整代码示例 ---- #include

    2.4K30

    【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

    文章目录 一、二级指针 1、为 二维指针 分配内存 2、为每个 一维指针 分配内存 3、释放 二维指针 内存 二、完整代码示例 一、二级指针 ---- 声明二级指针 : // 声明二维指针...二维指针 内存 先释放 二维指针 指向的 一维指针 的内存 , 这些 一维指针 指向其分配的 20 字节内存空间 , 存放了一个字符串信息 ; // 释放内存 // 先释放 num...= NULL) { free(p[i]); p[i] = NULL; } } 然后再释放 , 二级指针 指向的 内存..., 这些内存中存储这 一级指针 数据 ; // 再释放 二级指针 if(p !...// 先释放 num 个 一级指针 for(i = 0; i < num; i++) { if(p[i] !

    1.4K10

    C语言free释放内存后为什么指针里的值不变?竟然还可以输出?

    今天你家范儿给大家带来一个的东西——关于C语言为什么释放指针后,指向这块内存的指针的值不变问题的编程经验!!行了,咱们话不多少,直接上主食。...正所谓”有借有还,再借不难”, 不少同学会问为什么释放指针后,指向这块内存的指针的值不变呢,我们今天为大家揭秘。...下图可以看到,在VC6编译环境下,观察指针p的指针所指向的内容已经被strcpy后改变。 ?...而关于free之后,p的之后为何没有改变,仍然还是这个原先堆空间的这个地址,原因在于free函数仅仅是将malloc申请的内存释放回去,所谓的释放也就是告诉编译器,这块内存已经使用完毕,可以收回了。...这就是free释放内存后,指针内地址仍然存在,但有时还可以访问,有时候访问输出乱码或输出其他值的原因。 怎么样,大家明白了吗?我觉得是蛮有意思的,大家呢?

    2.6K80

    CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

    普通变量和指针变量 共性 PS: 可见这4个函数的汇编指令完全一致,无论是什么类型的指针变量,对指针变量的读写跟普通变量没有任何区别,所谓的指向只是描述指针变量的值时多少而已,就读写而言,指针变量跟普通变量没有任何区别...空指针和野指针指针:定义了一个指针变量,如果没有进行初始化,系统就会有可能随机赋值一个地址给这个指针变量,也就是说,这个指向指向一个未知的区域。...空指针:空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针...指针变量的+-运算 指针变量的加减运算:也就是做地址偏移,不同 的指针类型偏移的步长不同。...图片 图片 PS: 区分指针数组int *a[3]和数组指针int (*a)[3],前者时存放指针的数组,后者是指向数组的指针

    1.7K30

    初识指针指针指针变量、如何理解地址、指针类型的意义、void*指针、野指针、空指针)(笔记)

    解引用 return 0; } 二、指针指针变量 指针:地址 指针变量:变量-存放地址 指针变量用来存放地址的,指针变量并不完全等同指针...野指针是C语言中一个常见的内存泄漏问题。如果程序中存在野指针,当程序再次申请内存时,可能会将之前已经释放的内存分配给新的变量,导致程序出现不可预测的行为,甚至崩溃。 野指针成因: 1....指针未初始化 2.指针越界访问造成野指针 3.指针指向的空间释放 1....(i = 0; i < 10; i++) { *p = 1; p++;//数组越界访问 } return 0; } 3.指针指向的空间释放 int* test() { int a =...使用空指针进行解引用操作会导致程序崩溃,因为没有任何有效的内存地址可供访问。在C语言中,空指针主要用于表示指针变量没有指向任何有效的内存地址,例如未初始化的指针变量或已释放的内存块。

    16410

    【C语言】指针进阶:字符指针&&数组指针&&函数指针

    指针数组 数组指针 &数组名 与 数组名 数组指针的使用 数组传参、指针参数 一维数组传参 二维数组传参 一级指针传参 二级指针传参 函数指针 结语 前言 回想之前,我们学了指针的一些基础 指针与结构体...指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。 指针的运算。...有了前面的一些指针的基础之后呢,我们将从这篇博客开始,开始一起探究指针的高级主题:指针的进阶,将通过不止一篇的博客讲完这部分的内容,下面一起来看一看> ---- 字符指针指针的类型中我们知道有一种指针类型为字符指针...指针数组 在前面的时候,我们就认识了指针数组,指针数组是一个存放指针的数组。...有的,下面,我们来看看什么是数组指针 数组指针 数组指针指针?还是数组? 答案是:指针。 整形指针: int * pint; 能够指向整形数据的指针

    2.9K20

    CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

    普通变量和指针变量 共性 PS: 可见这4个函数的汇编指令完全一致,无论是什么类型的指针变量,对指针变量的读写跟普通变量没有任何区别,所谓的指向只是描述指针变量的值时多少而已,就读写而言,指针变量跟普通变量没有任何区别...空指针和野指针指针:定义了一个指针变量,如果没有进行初始化,系统就会有可能随机赋值一个地址给这个指针变量,也就是说,这个指向指向一个未知的区域。...空指针:空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针...PS: 区分指针数组int *a[3]和数组指针int (*a)[3],前者时存放指针的数组,后者是指向数组的指针。...这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

    1.7K20

    指针进阶(1)(字符指针指针数组,数组指针,函数指针

    前言: 本文主要讲解指针进阶部分的内容,分为字符指针指针数组,数组指针,函数指针。...int *arr[5];//存放整型地址的指针数组 char *arr[6];//存放字符类型的指针数组 数组指针 概念辨析 我们类比一下: 整型指针:指向整型变量的指针,存放整型变量的地址的指针。...数组指针:指向数组的指针,存放数组地址的指针。...形式辨析 int * p; 首先*表示这是一个指针,命名为p,然后指向的是int类型的指针,数组指针也一样 int(*p) [5]; 上面的形式就是数组指针,我们需要先用()把*和指针名括起来,然后剩下的就是指针指向的类型...数组接受时,行可以省略,但是列不能 指针接收,必须用数组指针来接收。 函数指针 函数指针就是指向函数的指针

    9410

    【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

    文章目录 一、结构体中嵌套二级指针 1、结构体中嵌套二级指针 类型声明 2、为 结构体内的二级指针成员 分配内存 3、释放 结构体内的二级指针成员 内存 二、完整代码示例 一、结构体中嵌套二级指针 -...设置返回值 *array = tmp; return ret; } 3、释放 结构体内的二级指针成员 内存 释放内存时 , 先释放 二级指针 指向的 一级指针 的内存 , 再释放 二级指针...内存 ; 核心业务逻辑 : // 释放 每个结构体的 address 成员分配内存 for(i = 0; i < count; i++) { // 释放一级指针...* 释放内存时 , 先释放 二级指针 指向的 一级指针 的内存 , 再释放 二级指针 内存 * @param array * @return */ int free_student(Student...设置返回值 *array = tmp; return ret; } /** * @brief free_student 释放内存 * 释放内存时 , 先释放 二级指针 指向的

    1.7K10

    如何证明sleep不释放锁,而wait释放锁?

    代码解析 从上述代码可以看出,我们给 wait() 和 notify() 两个方法上了同一把锁(locker),但在调用完 wait() 方法之后 locker 锁就被释放了,所以程序才能正常执行 notify...() 的代码,因为是同一把锁,如果不释放锁的话,是不会执行 notify() 的代码的,这一点也可以从打印的结果中证实(结果输出顺序),所以综合以上情况来说 wait() 方法是释放锁的。...notify() 方法并没有获取到 locker 锁,从上述执行结果中可以看出,而是执行完 sleep(1000) 方法之后才执行的 notify() 方法,因此可以证明调用 sleep() 方法并不会释放锁...sleep 状态的线程不能被 notify 方法唤醒; wait 通常有条件地执行,线程会一直处于 wait 状态,直到某个条件变为真,但是 sleep 仅仅让你的线程进入睡眠状态; wait 方法会释放对象锁...post/5e6a4d8a6fb9a07cd80f36d1 总结 本文我们通过 synchronized 锁定同一对象,来测试 wait 和 sleep 方法,再通过执行结果的先后顺序证明:wait 方法会释放

    2.7K20
    领券