倾城新手卡问题,新手请教一个free的问题~~~~~~

新手请教一个free的问题~~~~~~ - 故障解答 - 电脑教程网

新手请教一个free的问题~~~~~~

日期:2006-07-13   荐:
新手请教一个free的问题~~~~~~这样一个结构:struct Link{struct Link *Next;int i;};这是创建这个结构的函数:struct Link *Create(){return (struct Link *)malloc(sizeof(struct Link));}这是主函数中的代码 :struct Link *New;New = Create();New->i = 5;free(New);printf("%d", New->i);system("PAUSE");按理我创建了这个结构以后,再用free(New)释放掉这个结构以后,结构New->i应该是不能访问的,错误的。但为什么还可以通过New->i访问到值为5呢??这个地方不大明白。请指教。free只表示这块内容现在可以分配给别的地方使用,如果没有立即分配掉,它的内容还在的.并且New现在还没有换指向别的地方,它指向的地方并没有方式变化,结果所以就没变.但是,你不知道它指向的内容什么时候会发生变化,是一个不可预期的值按理我创建了这个结构以后,再用free(New)释放掉这个结构以后,结构New->i应该是不能访问的,错误的。但为什么还可以通过New->i访问到值为5呢??// free(New)只是把这块内存空间回收,但是并没有置NULL你可以在free(New)下面加一句:New = NULL应该就不能输出New->i的值了OK。是不是就是说调用了free函数,只说明这块内存区现在对于系统来说可以作为未使用的内存来分配。但实际直到有新的数据写入之前,他还是存储着之前的内容?指向这块内存区的指针还是正常的,只是这内存区的内容没办法估计,随时可能被其他的需要分配的地方所分配的内容占据?是的那计算已经使用内存大小的时候。这块被free的内存区还是有数据的(假设没有被其他内容占据),那这个内存区是作为已使用的内存,还是未使用的来计算的呢??未使用的你用了free()后当然是作为未使用的来计算对了New = Create();New->i = 5;free(New);printf("%d", New->i);堆里的内存销毁以后并不会破坏原来的数据仅仅是标记为已被系统回收直到被新的数据覆盖这个是不确定的可能永远都不会分配给别的指针也可能马上就分配给了别人就象你是负责管理一个文件的,你往里面写了很多东西,然后一天你被撤销这个任务你把文件交了出去但是文件的内容并不会因此消失除非有人改写了你的文件
标签: