当有时候我们需要的空间大小在程序运行时才能知道,那么数组编译时开辟空间的方式就不能满足了。
malloc和free
void *malloc(size_t size);
这个函数会申请一块连续可用的空间,并返回指向这块空间的指针。
如果开辟失败,返回NULL指针,如果size为0,这个函数未定义,取决于编译器。
void *free(void* ptr);
如果ptr指的空间不是动态开辟的,那free函数的行为未定义。
如果ptr为NULL指针,则free函数什么都不做。
malloc和free都声明在stdlib.h头文件中。
calloc
void *calloc(size_t num,size_t size);
为num个大小为size的元素开辟一块空间,并将空间每个字节初始化为0,这也是与malloc的区别。
realloc
relloc让动态内存管理更加灵活
void *realloc(void* ptr,size_t size);
ptr是要调整的内存地址,size是调整之后的新大小,返回跳整之后的新地址,会将原来内存中的数据移动到新的空间。
跳整内存空间有两种情况
1.原有空间足够大,会直接在后面追加。
2.原有空间不够,会重新找一块空间。
动态内存错误要注意一下几点
1.对NULL指针的解引用操作
2.对动态开辟空间的越界访问
3.对非动态开辟内存使用free释放
4.使用free释放一块动态开辟内存的一部分
5.对同一块内存多次释放
6.动态开辟忘记释放(内存泄漏)