malloc
malloc和relloc函数都需要头文件 <stdlib.h>.
malloc函数模型:void *malloc(size_t size);
malloc 会在堆上分配连续的空间。堆中空间没用名字,只能用指针使用。malloc函数返回的值没有类型(void*),需要按照开辟的需求强制转换成相应的类型。
用free()函数来释放malloc开辟的空间,free操作仅仅是释放堆上空间的使用权,并不会改变接受malloc返回地址的指针的指向。
同一块内存空间不能被多出释放。当释放完空间后,一定要将指针(p)设为NULL。再操作 free(p) 时,编译器不在报错。
原因:在进入free函数时,函数内部会先判断p的值,p=NULL直接返回,不继续执行free函数里面的操作命令.
实例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
int * p = (int *)malloc(sizeof(int)*10);
if (p == NULL)
{
printf ("内存分配失败\n");
return -1;
}
printf ("%p\n", p);//设输出p = 0x2000
free(p);
// free(p)--二次释放报错
printf ("%p\n", p); //p = 0x2000
// 当释放完空间以后,一定要将指针设为NULL
p = NULL;
//不再报错
free(p);
free(p);
return 0;
}
relloc
relloc()函数用来更改已经配置的空间。
函数模型: void *realloc(void *ptr, size_t size); ptr为原地址,size为重新分配需要的内存大小
扩大一块内存时,realloc()试图直接从堆上当前内存段后面的字节中获取更多的内存空间,如果满足则返回原指针。当后面的内
存不够时,则在堆上找到第一个能满足内存要求的内存块,将目前的数据复制到新的位置,将原先的数据块释放,返回新的地址。
如果剩余内存不足,重新申请空间失败,则返回NULL。
在接受relloc的返回值时需要一个新的指针变量来接受,不能用原先的指针接受新地址。如果重申失败,原指针接受为NULL,realloc失败原数据块没有释放,原先内存发生内存泄漏, 如果继续对原指针进行操作则会崩溃。(不能对NULL进行任何操作)
实例
int main()
{
int a;
int * p = (int *)malloc(sizeof(int)*10);
if (p == NULL)
{
printf ("内存分配失败\n");
return -1;
}
// p = (int *)realloc(p, sizeof(int)*20);错误:原指针接受relloc的返回值
int *tmp = (int *)realloc(p, sizeof(int)*20);
if (tmp == NULL)
{
printf ("重新分配内存失败\n");
return -1;
}
p = tmp;
printf ("p = %p, tmp = %p\n", p, tmp);
return 0;
}