C语言在进行动态内存时常会用到的三个函数分别是malloc,calloc和realloc。
malloc函数原型为:void *malloc(size_t size);
malloc的作用用于在内存中开辟连续的size个字节,并返回该内存块的起始地址,如果开辟内存失败,则返回NULL指针。
通常情况下,直接写出size为多少有些不太方便,这样的程序也不方便移植。如:
int *p=malloc(100); // 开辟一个100个字节的内存块,用于存放int类型变量。
你会发现上面的这句代码在32位机器和16位机器上所开辟出来相同大小的内存中可以存放的int类型变量个数是不同的,这就给移植程序带来了不便,因此一般不这样申请内存。
还有一种写法如下:
int *p=malloc(25*sizeof(int));
上面这一句代码无论是在32位机器还是在16位机器中所开辟出来的内存所能存放的int类型的变量数量都是25个,方便移植。
calloc函数原型:void *calloc(size_t num_elements,size_t element_size);
calloc和malloc的区别是calloc会把返回的指针初始化为0.另一个区别就是函数参数不同:num_elements是元素数量,element_size是元素大小(字节).
realloc函数原型:void realloc(void *ptr,size_t new_size);
realloc用于修改原先已经分配好的内存块的大小。
如果新内存比原来的内存大,则会在原来内存的后面开辟一块新的内存。
如果新内存比原来的内存小,则拿掉尾部多余的部分,保留的部分内容不变。
如果原来的内存不可改变,realloc将分配另一块正确大小的内存,并把原来那块内存的内容复制到新的内存上。
使用realloc后,应改用realloc返回的指针而不是原来的指针。
如果ptr是空指针,则realloc的作用和malloc一样。