为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

1 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

请问一下free是不是将标记为已使用的地址改为未使用,也就是里面的数据并未清空,只是改了下“标记”?

你说的这些是在猜测 free 的具体实现。 C 标准没有规定 free 具体实现应该如何,所以这个问题没有标准答案。

C 标准只是规定:

  • free 的参数必须是之前由库函数分配内存而来的指针,或是 null 指针

  • 参数如果之前被 free 了,则函数的行为是未定义的

  • 访问已被 free 的指针的行为是未定义的

当然,你的猜测也是有道理的。确实很多实现是这样的。

也许你的这些思考对你学习理解 C 语言有帮助。但是在学习和使用 C 语言时要记住:你不应该假定你的编译器会如何实现,只应该按照规定的语法规则来使用 C。



还有个问题就是用malloc创建一个在子函数中的数组,这个数组是动态存储类型吗,是不是自动存储类型(动态与自动的关系是什么?)?

是你说的“动态存储类型”的。其实就是指需要动态管理的内存(用 malloc 分配、free 释放...等)。

那当然就不是“自动存储类型”的了。你通常定义的普通变量一般都属于这种“自动类型”,这样的变量所占用的内存只在它所在的作用域中存在,离开其作用域后就会被销毁。

这两种存储类型的区别简单地说就是这样的。

所以才会强调说“手动分配的内存一定要记得 free 掉,不然就会内存泄漏”,就是因为这些所谓“动态存储类型”并不会被自动销毁。

查看完整回答
2 反对 回复 2018-05-11
  • 1 回答
  • 0 关注
  • 886 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信