malloc:
在堆区开辟一段连续可用的空间,并返回指向这块空间的指针。
1.返回类型是void*,malloc并未规定开辟空间的具体类型,由使用者决定。
2.如果开辟成功,返回指向这个空间的指针。
3.如果开辟失败,返回空指针,所以在使用malloc时要对返回的指针进行判空操作。
4.当size_t=0,这是标准未定义的,具体由编译器决定。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr[10];//在栈区开辟40个字节
int* p = NULL;
p = (int*)malloc(10 * sizeof(int));//在堆区开辟40字节
}
calloc:
1.calloc的作用是开辟num个大小为size的空间,并初始化为0。
2.与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0
realloc:
memblock:要调整的内存的地址
size:重新调整的内存大小
返回的是这块内存的起始位置
reallc调整内存的两种方式:
1.如果原有空间后面有足够的空间,直接在后面追加空间。
2.如果原有空间后面没有足够的空间,重新在开辟一块空间。把原来空间的数据拷贝过来,并原来空间的地址置于NULL,返回一块新的地址。
int main()
{
int *ptr = (int*)malloc(100);
if(ptr != NULL)
{
//业务处理
}
else
{
exit(EXIT_FAILURE);
}
//扩展容量
//法1
ptr = (int*)realloc(ptr, 1000);//error,如果申请失败,返回NULL,原来空间的起始地址会丢失
//法2
int*p = NULL;
p = realloc(ptr, 1000);
if(p != NULL)
{
ptr = p;
}
//业务处理
free(ptr);
return 0;
}
free:
释放动态开辟的空间,谁开辟谁释放。
1.如果memblock指向的是非动态开辟,这是标准未定义。
2.如果memblock指向NULL,则free函数没有任何操作。