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

一个很简单的函数,但是结果却很有趣,求高手指点迷津 test() {char *str = (char *) malloc(100); char

发布网友 发布时间:2022-05-09 16:55

我来回答

5个回答

热心网友 时间:2023-10-09 16:34

free(str);不代表把str清空,而是说str的内存空间是可以写入数据.那么,str原来的内容当然还在,
strcpy(str, "hello")时,str开始的6个字节(char)内存空间被写上了hello五个字符和一个结束符,因为你定义了字符串地址是从str开始的,*str='c';把第一个字节改成了C。在内存没有被刷新的时候它就会输出:cello,
根据Linux内存管理,你的程序申请的内存实际是一个虚地址,你释放后,系统会把你释放的地址加到free_list中,同一个虚地址的,实际的物理地址可能是不一样的。
我理解,你申请一次内存时,虚地址和实际物理地址的对应关系在释放时暂时不会变,但申请两次内存时,可能地址链表已经变化了,再释放,实际物理地址已经变了。

热心网友 时间:2023-10-09 16:35

free函数仅仅将指针所指向的内存释放,并未将指针指向NULL,该段代码中str指针将会变成野指针,而使用野指针是一件十分危险的事情。

热心网友 时间:2023-10-09 16:35

这个程序本身就不正确,已经将申请的内存释放了,再去访问,是会引起程序崩溃的。很危险的做法

热心网友 时间:2023-10-09 16:36

以下全是我猜测的:
你上网搜一下free的源代码就知道了,free函数只是把malloc申请到的内存块中某个特殊的标志变了一下而已,并没有立刻就清空内存块中的数据。是否释放这块内存是操作系统自己来判断的,而且释放后是否会对内存块链进行调整,使内存碎片减少,都是用操作系统自己来进行的。

所以,我认为如果没有第二个malloc语句的,free(str)之后这个程序申请的内存块全都没有了,这种情况下,内存的可使用空间已经最大了,操作系统可能会等到程序结束后再统一清理内存,暂时不处理内存块链。而如果有第二个malloc语句的话,free(str)后,在内存块链上还有分配的内存块的情况下,系统可能会对内存块链进行一定调整,以减少内存碎片,很可能在这个调整的过程中,str指向的那片内存空间的数据受到了影响,变成了脏数据,所以输出了乱码。追问其实我也是认为,第二个malloc语句导致了编译器对第一个malloc开辟的内存做出了修改(在free之后),但是不清楚编译器处理的过程。
你说的没有第二个malloc语句,free(str)之后,这个程序申请的内存块没有了,我觉得还是存在的,就像你说的特殊标志变了一下而已,其实里面的数据都是没有被更改的。str依然指向这块内存。

追答我说的“程序申请的内存块没有了”的意思是,系统把程序申请的所有内存块给串连成了一个链表,当你最后一个malloc的内存块free掉的时候,这个链表就空了。虽然这时候内存块的数据都还在,但系统看到链表空就认为内存是空的,所有区域都是可用的。

热心网友 时间:2023-10-09 16:36

ransition and uncertainty
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
荣耀v20杀后台严重? 聊天时哪些回复让人感觉不舒服? 货物运输保险案例分析 卞和泣玉注释 求解,卞和泣玉没学过,在线等解。 葛加走之底读什么 在等腰三角形ABC中,AB=AC=5,BC=6,求角B的三角函数值 ...人开走一架战斗机,在一架客机下面飞,好几个飞机来拦截, ...话是三架飞机 机型各不同 在山区飞行发现恐怖分子用驴车运核弹 用AK... ...的成为战斗机飞行员。战争结束回国继续抢银 使用malloc和free有哪些注意事项? c语言编程中提及的内存碎片该怎么理解 怎么注册 怎样申请 手机怎样申请 怎样注册新 怎么申请呢 怎么申请 注册 我想申请一个怎么申请的 怎么申请呢? 我的信用卡期已经逾期90多天了,这个对个人信用有什么影响? 怎样申请 婴儿积食怎么办速解法?宝宝积食喝亦舒堂沙棘红果粉有用吗? 小米云服务同步了后,自己手机相片是同步到云相册还是所有设备的本地照片 小孩积食发烧怎么办?积食可以喝沙棘红果粉? 沙棘紫苏油什么作用 宝宝食用效果如何 小米手机本地相册与相册的不同 孩子脾胃虚弱可以吃沙棘红果粉吗? 小米手机相册里有有个云相册,手机一拍里照片不开流量云相册里面就有了!那个还占内存吗?如果换了手机云 小孩肠痉挛能喝沙棘茶吗! c语言malloc函数当申请的空间大于内存时是否会使用虚拟内存? 什么是虚拟内存?我的电脑为什么总是会说我的虚拟内存太小呢? 梦到把鱼赶到山顶上是什么意思? 我叫MT4模拟器上玩这款游戏怎么样? 开汉堡店需要办理哪些手续 我叫mt4有电脑版吗 梦见抓鱼好吗? 周公解梦梦见抓到鱼后爬独木上了岸 汉堡店需要办理哪些证件 怎么在ppt上找到文本框的模版,最好要有图,谢谢 蛋糕和汉堡怎么审请营业执照 我在徐州开了一家汉堡店里面有汉堡薯条披萨米线炒面鸡排饭烤肉拌饭的想办一个营业执照应该办什么样的? 汉堡的卫生许可证和营业执照好办么?需要多久能申请下来?要准备什么资料么? d做私房汉堡需要办理营业执照吗 便利店卖关东煮、汉堡、鸡翅等等需要什么批证件的吗? 小城市开个炸鸡,和汉堡的小店,需要办什么证,大概需要多钱。 草图大师怎么吸取旁边的 很多压缩包,但是都有密码(密码都一样),如果一个个解压,每次都要输入密码,有没有办法一次性解压? 老铁,富士X100F跟索尼五代,哪个性价比更高 壁挂炉里应该注纯净水还是自来水?