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

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


GODDOOGE
浏览 887回答 1
1回答

onemoo

请问一下free是不是将标记为已使用的地址改为未使用,也就是里面的数据并未清空,只是改了下“标记”?你说的这些是在猜测 free 的具体实现。 C 标准没有规定 free 具体实现应该如何,所以这个问题没有标准答案。C 标准只是规定:free 的参数必须是之前由库函数分配内存而来的指针,或是 null 指针参数如果之前被 free 了,则函数的行为是未定义的访问已被 free 的指针的行为是未定义的当然,你的猜测也是有道理的。确实很多实现是这样的。也许你的这些思考对你学习理解 C 语言有帮助。但是在学习和使用 C 语言时要记住:你不应该假定你的编译器会如何实现,只应该按照规定的语法规则来使用 C。还有个问题就是用malloc创建一个在子函数中的数组,这个数组是动态存储类型吗,是不是自动存储类型(动态与自动的关系是什么?)?是你说的“动态存储类型”的。其实就是指需要动态管理的内存(用 malloc 分配、free 释放...等)。那当然就不是“自动存储类型”的了。你通常定义的普通变量一般都属于这种“自动类型”,这样的变量所占用的内存只在它所在的作用域中存在,离开其作用域后就会被销毁。这两种存储类型的区别简单地说就是这样的。所以才会强调说“手动分配的内存一定要记得 free 掉,不然就会内存泄漏”,就是因为这些所谓“动态存储类型”并不会被自动销毁。
打开App,查看更多内容
随时随地看视频慕课网APP