您的位置:首页 > 其它

malloc和relloc函数的作用和其注意事项

2018-01-24 20:24 633 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: