内存分配函数
在C语言中内存分配有动态和静态,静态内存分配是在编译时分配好的,典型代表就是局部变量。动态内存分配是通过malloc(), calloc(), realloc() 进行申请内存,这三个函数都是向堆中申请的内存空间。
有关于内存分配有很多说明 这里主要有以下几点:
- 函数原型
void *malloc(unsigned int num_bytes);
void free(void *ptr);
void * calloc(size_t num,size_t size);
void * realloc(void * ptr,size_t size);
返回类型是void * 任意指针,使用时需强制类型转换。
-
free函数
free函数用来进行内存释放,静态内存分配时,编译器根据内存定义的作用域和生存周期进行内存合理安排,尽可能减少内存浪费,当变量生存期结束后内存会被回收。而动态内存需要通过free函数进行内存释放,不然会造成内存泄漏。C语言如此,其他高级语言也有相应的内存回收措施,更高级一点JavaScript虚拟机会帮助程序员进行内存管理。 -
malloc、calloc、realloc
malloc()函数会向堆中申请一片连续的可用内存空间。
void *malloc(unsigned int num_bytes);
calloc()函数会在返回地址之前将所申请的内存空间中的每个字节都初始化为0 。
void *calloc(size_t n, size_t size);
realloc尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。
https://www.runoob.com/cprogramming/c-function-realloc.htm
void *realloc(void *ptr, size_t size)
这里需要注意的是当前指针指向是否有足够内存空间如果有扩大分配,没有则自动释放掉当前指针,重新分配内存空间并返回指针。
4、其他内存操作函数
void *memset(void *str, int c, size_t n);
void *memmove(void *str1, const void *str2, size_t n)
void *memcpy(void *str1, const void *str2, size_t n)
memmove和memcpy内存中叠处理不同:memmove保证重叠部分也拷贝成功 具体原因和拷贝方法有关
https://blog.csdn.net/li_ning_/article/details/51418400