动态分配内存与悬空指针

2021年09月15日 阅读数:3
这篇文章主要向大家介绍动态分配内存与悬空指针,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

              int  F(int **P)数据结构

              {ide

                         int   a=10;函数

                        *P = &a;spa

                         return 0;指针

                }              生命周期

             这是之前想过的一个问题:假如在F函数中中定义了一个自动变量a,而后有一个形参(**P),将*P指向这个a的地址。调用F函数的时候,系统会自动为这个变量a分配内存空间,它固然不会在程序的整个生命周期永久存在,在执行完F函数的时候,系统又会自动释放变量a的存储空间,那么指向a地址的指针*P怎么办?(注意,*P指针自己也是有内存空间的)进程

             原来*P变成了悬空指针。悬空指针是很危险的,它会指向一个无效的地址,若是它被一直放着不用还好,程序结束天然也结束。可是,万一它已成悬空指针,而在程序中又对它进行操做(好比读入新的数据),那潜在的危险性可大了,由于你不知道它指向了什么地址,万一指向的是系统的核心进程呢?可能致使系统崩溃!若是指向了其余硬件设备,如打印机啊,CPU方面的东西,那后果不堪设想。内存

             因而,咱们能够动态来分配内存存储空间,例如使用malloc或realloc。it

              *P = ((int *)malloc(sizeof(int )) == N ULL);class

              这样的话,这个malloc分配存储空间会一直存在(除了在程序中显式释放),直到系统调用free函数的时候来释放。因此,就算前面的F函数执行完以后,这个存储空间仍是存在的,但这个跟自动变量的自动分配存储空间是彻底不一样的,*P指向malloc分配的空间,不会再随便指向一个地址了。

              固然,动态内存分配也会带了内存泄漏的问题,有时候也会很严重,因此动态内存也不是随便分配的,须要统一的管理方法,好比数据结构实例,这是后话了……