一个很简单的函数,但是结果却很有趣,求高手指点迷津 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