又是一个周一,每一个明天都是未知的,我们只有把握好今天,那么在未来的某一个明天才会有惊喜等着你,它就在那里等着你的,你可不能半途而废呀!
本期的内容,我们一起来学一学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 的实现有两个好处:
而且我们的柔性数组还可以应用其他的地方:柔性数组在处理变长数据时非常有用,比如处理网络数据包、文件格式等。它提供了更灵活的内存管理方式,使得我们能够高效地操作变长数据。
时光总是短暂的,相逢的时间总是那么地短暂,希望往后的每一次的相遇都会是更好的你,本期就到这里就结束咯,希望会对你有所帮助!时光不语,却回答了所有问题!