1.malloc函数
void*malloc(size_t size);(stdlib.h)
功能:在堆区上申请一块大小为size字节的连续空间,返回指向这块空间的地址.
需要注意的是,malloc函数有可能申请失败,此时返回NULL,所以申请之后一定要先检验再使用.
好处:类似于c99中的变长数组,你可以让size为变量,在运行过程中开创想要大小的空间,但是变长数组一但开创就不可改变,而动态空间可以通过realloc改变.
注意:1.如果size为0,可能造成未定义行为.
2.C语言本身不设计程序结束后动态内存的释放,尽管一些操作系统会防止内存泄漏,但为了保险,使用该空间后还是最好要释放,用free函数
2.free函数
void free(void*ptr);(stdlib.h)
功能:释放动态内存空间.ptr必须指向动态空间首地址.
注意:1.如果ptr为NULL,则什么都不做.
2.如果ptr指向了非动态空间,则结果未定义.
3.如果指向动态空间的一部分则程序崩溃.
4.如果多次释放则程序崩溃.
5.没有释放可能导致内存泄漏,如图:
出了test,没人记得这个动态空间的位置,无法再释放它,造成了"吃内存"现象.
2.free函数是值传参,释放空间后,实参的指向仍为原动态空间,这就相当于实参成了野指针,为了避免这种情况,在free语句后要让实参指向NULL
3.calloc
void*calloc(size_t num,size_t size);(stdlib.h)
与malloc只有两处区别:
1.开创num个大小为size字节的连续动态空间
2.开创后会把元素初始化为0(本文只有该函数有此特性),而malloc为随机值;
4.realloc
void* realloc(void*ptr,size_t size);(stdlib.h)
功能:把ptr指向的开辟好的动态内存空间变为size大小.返回值比较复杂,有三种情况:
1.如果扩大或缩小空间失败会返回NULL.
2.如果扩大空间后与别人的空间重合,那么它会寻找一个新的能容下扩大后的空间的位置,并把旧位置的数据拷贝过去,此时返回的是新空间的地址.
3.如果扩大空间后不与别人的空间重合,返回ptr.
注意:realloc(NULL,size)等价于malloc(size);
5.柔性数组(c99)
如何称为柔性数组
1.数组在结构体中
2.数组是结构体的最后一个成员,且前面必须有其他成员
3.数组大小未知
注意:
柔性数组的大小不计算在结构体大小之内.
使用举例: