问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言中free释放了一个结构体,但是它里面的指针却依然可以访问?

发布网友 发布时间:2022-04-15 03:56

我来回答

1个回答

热心网友 时间:2022-04-15 05:25

free函数,实际上做的事情不是真正的释放内存。
首先你要清楚,内存是由操作系统来管理的(操作包括分配、释放等)。
系统中的内存在c语言分配内存机制上被分为很多个块,c的底层代码用数据结构chunk来表示。chunk中有一个标志位,用来表示该内存块是否为待分配或者已分配状态。每一次调用malloc,这个标志位会被设置1(好像是1,记不太清楚了),调用free时被设置为0. 操作系统的内存管理机制会根据这个值来分配和释放内存。
也就是说调用free的时候,只是设置了这个标志位(当然还做了其他事,就你这个问题而言,只讨论这个),而内存还原封不动的在那里。所以,当你在系统真正释放这个内存之前再次访问这个地址,你会得到你想要的结果。
说明,“输出test1->a为0”,这个的原因可能是free的时候,设置chunk块的标志位时,覆盖了a的值。chunk数据结构中,第一个字节的前8位是标志位,后面还有24位也有各自的用处。具体是什么导致a的值为0的,你有兴趣的话,你可以自己去研究。可以去阅读linux的glibc源码。
"(*test1->next).a为10",就简单了。next偏移struct test所占内存的“头(head)”距离较远,free的时候的一些设置值的操作没有影响到,能访问到这个指针的值,并且test0还在函数栈中完整保留,自然就能访问到了。

P.S c/C++的malloc/free和new/delete都有这个特性,所以编程的时候要养成一个良好习惯,在调用free和delete的时候要将指针赋值为NULL,如:
free(ptr);
ptr=NULL;
或者
delete ptr;
ptr=NULL;
c语言中free释放了一个结构体,但是它里面的指针却依然可以访问?_百度...

free函数,实际上做的事情不是真正的释放内存。首先你要清楚,内存是由操作系统来管理的(操作包括分配、释放等)。系统中的内存在c语言分配内存机制上被分为很多个块,c的底层代码用数据结构chunk来表示。chunk中有一个标志位,用来表示该内存块是否为待分配或者已分配状态。每一次调用malloc,这个标志位...

数据结构 c语言 中 要释放一个结构体 就只用free这个结构体的指针就够...

如果结构体里还有指针的话,这样做是不行的

c语言,请问为什么子函数中数组malloc会被free掉,但是结构体不会?

这个结构体能带回值,是因为你的函数定义createList(Slist &a)形参使用了引用&,C++中的引用可以很方便地做到修改形参的同时修改实参。另外,C++语言建议尽量避免使用malloc手动去申请内存,因为在复杂条件下很容易没有正确free,导致内存泄漏。建议使用vector容器去保存数组,函数定义使用(vector<int> &a)...

C语言,结构体指针变化后,原先的结构体会怎样?

对于这种只分配,但是没有释放的做法,有一术语称之为 “内存泄漏(MEMORY LEAK)”,也就是如果你这种操作在一个循环中进行,那么会有越来越多的内存被浪费掉,严重的可能会占满你的内存导致内存不足!正确的做法是,如果你确信某块动态分配的内存不再被使用的话,要首先进行释放(free)操作,也就...

c语言中指向结构体指针问题,求大神,为甚么printf("%d",*p);错误*去掉...

p是结构体指针,s是结构体数组,指针也是数字,应该是长整型数字,s[0].num是结构体数组中的一个普通整型数字,p=(struct student*)s[0].num;这一行虽不报错,但p指向的单元的内容是未知的,类型也是未知的,不建议这样做;所以printf("%d",*p);这一行以数字格式输出*p就报错了,把*去掉,...

请教大家一个c语言中的问题?这个问题已经困扰我很久了。题目如下:

另外你应该知道,C语言函数只能按值传参,而且形参被分配在栈上 对于指针,同样是按值传参的,只不过对指针进行间接引用(解除指针运算)时,被访问的都是同一个地址罢了,所以指针是个不特例的特例 有了这些基础知识,我们可以来解决你的问题了 首先,你第一个例子里的程序在fun函数中定义了一个指针...

C语言中,声明一个结构体类型时,大括号内是该结构体所包括的子项,称为...

结构体的成员变量

这个c语言结构体链表为什么已经定义了结构体类型的指针,还要再malloc...

指针必须初始化指向一个内存地址。或者=NULL,否则就是野指针!SLIST是一个结构类型,定义该类型变量当然要初始化了。malloc就是给这个指针申请了一个结构大小的内存空间让它指向。否则你引用不了指针指向的地址。注意malloc申请的内存,不会自动释放,不用的化需要用free释放掉。

在C语言中,一个结构体数组,成员的指针函数。怎样对这个指针赋值?

定义一个函数:void f(void *d){ } {ReadData,0,0,f}。

C语言里结构体的问题。结构体定义指针类型是怎么回事?

将得到的内存地址强制转化为HuffmanTree(即HTNode指针类型)。5、malloc是C语言中常用的动态分配内存的语法,划重点“动态”,当你需要动态申请内存时(例如给数组扩容,还有此处的为结构体申请空间)时用到该语法,C语言中内存相关语法还有realloc,free可以自行了解一下。在C++中new和delete更为常用。

c语言struct结构体 typedef结构体指针 c语言结构体详解 c语言结构体定义 c语言结构体赋值 c语言结构体初始化 c语言结构体输入学生信息 结构体 释放 怎么释放结构体
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
彩纸伞的保养与清洁 彩纸伞的保养与清洁视频 刚买的拉杆音响个要天天充电的 求助!去秦皇岛旅游住在那最方便。 海尔热水器怎么除水垢? 区块链母链子链什么关系? 《《神墓OL》剧本为王!原汁原味的小说改编网游》最新txt全集下载 神墓之网游败天的txt全集下载地址 《网游之神墓》最新txt全集下载 网游之神墓世界的txt全集下载地址 衣物除皱的小技巧有哪些? 为什么我用360免费wifi开了热点后手机连接上了但上不了网 电脑用360随身WIFI转换到网卡连不上苹果手机的热点总是提示连接不成功,有什么解决的方法吗? 360wifi手机能连上也能上网,电脑win10自带移动热点手机显示已连接不可上网? 360n5s怎么也连不上carlife 缘字去掉绞丝旁加上口字旁念什么 左边是木字旁,右边是缘字不要绞丝旁,是什么字? 缘绞丝旁换成口是什么字 我电脑上开启了360免费wifi 可是手机就是搜不到360的热点 怎么回事啊?用别人的手机也搜不 一个口字旁加一个缘份的缘去掉绞丝旁,那个字念什么 如题,哪位好心人帮帮忙 缘分的缘去掉绞丝旁,在右边加个鸟,这是什么字,在线等答案,速度 360免费WIFI开启后手机收不到热点怎么回事 缘字去掉绞丝旁加上一个提手旁是什么字?拼音是什么? 竹字头加缘去掉绞丝旁(上下结构)怎么读 网络控制器和网络适配器区别 谁能回答网桥和交换机、路由器最大的区别吗? “缘”字去掉绞丝旁,上面加上艹? 集线器、交换机、多电脑控制器/切换器有什么区别? 网络控制器与以太网控制器有什么区别 缘去掉绞丝旁还有几画 口字旁一个缘去掉绞丝旁念什么 网上投资黄金哪家好? 只掌握了AI,PS,CDR三种软件,能用此三种软件做产品外观设计吗? 彩涂板适用哪些领域? 现货黄金线上投资平台,谁能推荐个? 活动板房夹层生产有没有污染 平面设计有AI和CR他们有什么区别呀 是不是只要学习一个就可以了 设计画册和VI用cdr好还是ai好啊,望专业人士从方便程度和发展趋势上指... PS和AI都有哪些区别啊? 黑龙江钢结构 高浓度污水处理 工业污水处理中为什么高浓度的含盐废水对微生物的影响特别大? 含有高浓度污染物的工业废水处理的具体工艺流程 石油化工废水的高浓度及难生物降解废水处理 污水处理中所说的高浓度有机废水,高浓度的限制是多少? EXCEL2007任务栏缩略图怎么才能不显示Microsoft字样,直接显示文件名? 移动现在还可以携号转网到联通吗 现在手机号都可以携号转网!具体怎么办理? 拍蓝色证件照女生适合什么样的发型 注册不了怎么办? 珠宝品牌有哪些?珠宝大牌奢侈品牌有哪些?