为何释放内存后,悬空指针仍显示相同的内存地址?
问题解析
首先你的代码里存在两个核心问题:
错误的free操作
你先用malloc分配了堆内存给ptr_a,但随后把ptr_a赋值为栈变量a的地址&a。此时ptr_a已不再指向堆内存,而free仅能释放堆上通过malloc/calloc/realloc分配的内存,栈内存由系统自动管理,不能用free释放——这行free(ptr_a)属于非法操作,会触发未定义行为。指针变量的本质
指针本身是个存储内存地址的变量。free的作用是告知操作系统:之前分配的堆内存可被回收复用,但它不会修改指针变量自身存储的地址值。哪怕你释放了正确的堆内存,指针变量里的地址数值也不会自动改变,只是该地址对应的内存已不属于你的程序,此时指针成为悬空指针。
回到你的代码,ptr_a存储的是a的地址,free操作虽非法,但并未改变ptr_a内的地址值,因此两次打印的地址完全相同。
内容的提问来源于stack exchange,提问作者Debojit
相关产品推荐
相关产品推荐

