free问题求解

骑着蜗牛学 2016-12-16 11:49:28
int main(int argc, const char * argv[]) {
int *i = (int*)malloc(sizeof(int));
*i = 1;

int* p = i;

free(i);

*p = 5;
*i = 2;

printf("%d", *p);

return 0;
}

调用free后,malloc分配的内存被释放了,那i和p都指向这块内存,释放后,都可以正常操作,比如此时i=NULL,但是p也可以正常操作。
想问一下,free释放的到底是什么,free后不应该i,p都不可以了吗?

...全文
187 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2016-12-16
  • 打赏
  • 举报
回复
没出错不代表你是对的,可能你程序之后将这片内存分配给其他变量,你就修改了不属于你的内存
赵4老师 2016-12-16
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。 提醒:Linux下的malloc和free都是开源的。
骑着蜗牛学 2016-12-16
  • 打赏
  • 举报
回复
或者说,i在堆上,p在栈上,但是打印出来地址都是一样的。0x1004002d0 不太明白。
yes-hyh 2016-12-16
  • 打赏
  • 举报
回复
引用 5 楼 u010637941 的回复:
谢谢各位的回复,那请教一下,free(i),这个时候p可以正常的,p,i不是指向同一个地址吗?操作系统这一块暂时还没有了解学习呢。
实际上malloc、free的过程与操作系统无关,这是C环境的逻辑,你的程序一开始,便会向操作系统申请一大块堆空间,之后对于小内存的malloc、free都是这一大块堆空间的操作。 你调用free释放,仅仅是对于C环境内存管理而言。实际上对于操作系统来说这块内存已经是你的了,你当然可以使用! free仅仅只是C环境将此内存标记为可用,以便下次你再malloc,这块内存可以再次被用到。
骑着蜗牛学 2016-12-16
  • 打赏
  • 举报
回复
谢谢各位的回复,那请教一下,free(i),这个时候p可以正常的,p,i不是指向同一个地址吗?操作系统这一块暂时还没有了解学习呢。
小灸舞 版主 2016-12-16
  • 打赏
  • 举报
回复
当free一块内存后,free(即运行库)会将这块内存标记为未使用,并不会清零或者说不能继续访问。
你继续使用free后的内存是个未定义行为,一旦这块内存被别的变量使用就会出错

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧