malloc
void* malloc( unsigned size)
申请size个字节的地址连续的内存单元
成功则返回指向内存块的指针,
失败则返回NULL
malloc不对申请的空间初始化
calloc
void*calloc(unsigned n,unsigmed size)
申请n* size字节的个地址连续的内存单元
成功则返回指向内存块的指针,
失败则返回NULL
calloc将申请的空间初始化为0
使用calloc和malloc要包含头文件stdlib.h和malloc.h或者alloc.h
申请方法
malloc()或calloc()函数的返回值是一个(void*)类型的指针,
在使用前需要将函数的返回值转换成特定指针类型,赋给个指针。
常见的使用方法为
int *p,int i
p=(int*)malloc(i*sizeof(int))
free
void free(void *p)
动态内存释放函数(在程序还没有结束/退出的情况下,程序结束或者时退出系统会自动回收内存。)
它只能释放动态内存,不能释放其他变量的内存。
free()中的参数必须是要释放的动态内存的首地址。
free不允许部分/局部释放,
即它里面的参数不能是要释放的动态内存的首地址+数字等
free(p)释放内存之后,p中的地址是不变的,但他之前的内存被释放了,所以p变成了野指针,所以为了安全,最好在释放完空间之后让p=NULL
不能对同一内存多次释放,不然会报错
realloc
void*realloc(void*p,unsigned int size)
是动态内存分配调整函数
动态内存申请成功后,可以用realloc再度调整大小。
p指向需要调整的内存的首地址,size表示需要调整为多少个字节。
realloc的使用分两种情况
如果是情况一,realloc会重新找一个能够放得下更多字节的而且没有被别人用着的空间,再把原开辟的空间中的数据拷贝过去,再释放原来的空间的内存
此时他会返回一个新的指针,指向新的地址。
如果是情况二,返回的就还是之前的指针
如果失败则返回NULL
因为失败了会返回NULL,所以不能直接用原来的地址来接收。
最好用一个新的指针来接收,然后判断这个指针接收到的值是不是NULL,不是在赋给原来的指针。
realloc(NULL,字节数),此时的realloc相当于malloc