动态内存管理
又是一个周一,每一个明天都是未知的,我们只有把握好今天,那么在未来的某一个明天才会有惊喜等着你,它就在那里等着你的,你可不能半途而废呀!
本期的内容,我们一起来学一学C语言中的动态内存管理,学好这一章,那对于我们后面学习数据结构是有很大帮助的!
🐷1. 为什么要有动态内存分配:
在已有的知识中,我们已经知道内存的开辟方式,例如:
int a = 0;//在栈空间上开辟4个字节
char c = 0;//在栈空间上开辟1个字节
char arr[10] = {0};//在栈空间上开辟10个字节的连续空间
🐇2. malloc和free:
🐇malloc:
使用该空间:
?那么我们申请了空间,是不是用完了该还回去呢,这样我们下次才好去借呀,哈哈!
🐇free:
那么将 p赋为空指针是否有必要呢?如果不赋为空指针的话,那么我们的p还是会指向刚刚申请的空间,但那块空间已经释放还给操作系统了,所以为了避免p以后成为野指针,这里将它赋为空指针。
🐻3. calloc和realloc:
🐻calloc:
?
🐻?realloc:
? 情况1:原有空间之后有足够大的空间
要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发?变化。
🐱4. 常见的动态内存的错误:
🐱4.1 对NULL指针的解引用操作:
🐱4.2 对动态开辟空间的越界访问?:
🐱4.3 对非动态开辟内存使用free释放?:
🐱4.4 使用free释放?块动态开辟内存的一部分?:
🐱4.5动态开辟内存忘记释放(内存泄漏)?:
🐕5. 柔性数组:
柔性数组(Flexible Array)是一种特殊的数据结构,它允许在结构体的末尾定义一个具有可变长度的数组。柔性数组的大小在运行时确定,这使得它成为处理变长数据的一种灵活的选择。
柔性数组的声明方式是将一个未知大小的数组放置在结构体的末尾,但是这个数组的大小可以在结构体实例化之前或之后进行动态分配。
🐕6.1柔性数组的特点:
😊? 结构中的柔性数组成员前?必须?少?个其他成员。
😊? sizeof 返回的这种结构大小不包括柔性数组的内存。
😊? 包含柔性数组成员的结构?malloc ()函数进?内存的动态分配,并且分配的内存应该?于结构的大小,以适应柔性数组的预期大小。
4个字节?说明sizeof在计算时,没有计算数组arr的大小,因为它此时就是为柔性数组,大小是未知的。
🐕6.2 柔性数组的使用:
对于上述的代码,我们也可以用另外种方法来完成。我们先为结构体申请一块空间,然后再为数组申请一块空间?。
上述 代码1 和 代码2 可以完成同样的功能,但是 ?法1 的实现有两个好处:?
而且我们的柔性数组还可以应用其他的地方:柔性数组在处理变长数据时非常有用,比如处理网络数据包、文件格式等。它提供了更灵活的内存管理方式,使得我们能够高效地操作变长数据。
时光总是短暂的,相逢的时间总是那么地短暂,希望往后的每一次的相遇都会是更好的你,本期就到这里就结束咯,希望会对你有所帮助!时光不语,却回答了所有问题!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!