快捷导航

请解答一下关于C语言的3个问题?

请问一下free是不是将标记为已使用的地址改为未使用,也就是里面的数据并未清空,只是改了下“标记”?
还有个问题就是用malloc创建一个在子函数中的数组,这个数组是动态存储类型吗,是不是自动存储类型(动态与自动的关系是什么?)?它离开作用域是不是存储内容不会被清除?

免责声明:本内容仅代表回答者见解不代表本站观点,请谨慎对待。

版权声明:作者保留权利,不代表本站立场。

回复

使用道具 举报

参与会员1

请问一下free是不是将标记为已使用的地址改为未使用,也就是里面的数据并未清空,只是改了下“标记”?
你说的这些是在猜测 free 的具体实现。 C 标准没有规定 free 具体实现应该如何,所以这个问题没有标准答案。
C 标准只是规定:

  • free 的参数必须是之前由库函数分配内存而来的指针,或是 null 指针
  • 参数如果之前被 free 了,则函数的行为是未定义的
  • 访问已被 free 的指针的行为是未定义的
当然,你的猜测也是有道理的。确实很多实现是这样的。
也许你的这些思考对你学习理解 C 语言有帮助。但是在学习和使用 C 语言时要记住:你不应该假定你的编译器会如何实现,只应该按照规定的语法规则来使用 C。




还有个问题就是用malloc创建一个在子函数中的数组,这个数组是动态存储类型吗,是不是自动存储类型(动态与自动的关系是什么?)?
是你说的“动态存储类型”的。其实就是指需要动态管理的内存(用 malloc 分配、free 释放...等)。
那当然就不是“自动存储类型”的了。你通常定义的普通变量一般都属于这种“自动类型”,这样的变量所占用的内存只在它所在的作用域中存在,离开其作用域后就会被销毁。
这两种存储类型的区别简单地说就是这样的。
所以才会强调说“手动分配的内存一定要记得 free 掉,不然就会内存泄漏”,就是因为这些所谓“动态存储类型”并不会被自动销毁。
回复

使用道具 举报

可能感兴趣的问答

发新帖
  • 微信访问
  • 手机APP