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更为常用。