内存主要分三部分空间,栈区,堆区,静态区,而动态内存函数开辟出来的内存空间是在堆区的。
栈区:局部变量,函数形参
堆区:动态内存分配的,(malloc,calloc, realloc, free)
静态区:全局变量,静态变量
malloc函数:
malloc函数如果开辟空间成功,则返回那块空间的起始地址,如果开辟空间失败(可能原因:开辟的空间太大),则返回NULL,所以要检验返回的指针,
当开辟空间成功,并使用完毕后,应尽快释放这块空间(把这块空间还给操作系统),应用free()函数释放空间,释放完毕后p就是一个野指针了,为了避免以后通过p非法访问内存,应把p置为NULL
calloc函数:
calloc开辟好空间后,会把空间内容初始化为0
realloc函数:
realloc 函数分三种情况:
如果realloc函数第一个参数是NULL,则功能相当于malloc
下面看下动态内存开辟时的几种常见错误:
1. 对空指针的解引用:
2. 对动态开辟空间的越界访问:
3.对非动态开辟空间的释放
4.释放动态开辟内存中的一部分
5.对同一块动态开辟内存的多次释放
6.动态开辟内存忘记释放(内存泄漏)
柔性数组:
1.结构中的柔性数组成员前面至少一个其他成员
2.sizeof返回这种结构大小不包括柔性数组的内存
3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。



