动态内存函数介绍(malloc, calloc,realloc,free)

目录

malloc

free

calloc

realloc


malloc,free,calloc,realloc函数的声明在stdlib.h头文件中。

malloc

void* malloc(size_t size)

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

如果开辟成功,则返回一个指向开辟好空间的指针。

如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要检查。

如果参数size为0,malloc的行为是标准是未定义的,取决于编译器。

返回值类型是void*,所以malloc函数不知道开辟空间的类型,具体在使用的时候使用者自己来决定。

return value

malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available. To return a pointer to a type other than void, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return from malloc, even if the amount of memory requested is small.

parameter

size

Bytes to allocate

更好的写法是在malloc前进行强制类型转换。

char* string = (char*)malloc(20);

代码片段最后当malloc函数开辟空间成功后,有一个free函数。

free

Deallocates or frees a memory block.

void free( void* memblock)

这个函数的作用是释放通过malloc,calloc,realloc开辟的空间。它只能释放动态内存函数开辟的空间。

在对开辟的空间进行释放之后,还可以再加一行代码。

string = NULL;

将指针变为一个空指针。当空间释放后,string就变成了一个野指针,我们无法使用string指向的内存空间。如果强行使用,会引发程序错误。因此将string变成一个空指针最保险。

calloc

void* calloc(size_t num, size_t size) 

函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0.这也是calloc函数和malloc函数的区别。

realloc

realloc函数可以用来对动态开辟内存的大小进行调整。

void* realloc(void* ptr, size_t size)

ptr是要调整的内存地址。

size是调整后的字节个数。

返回值是调整后的内存起始位置(注意是调整后并不一定是ptr中存储的地址)

第一种情况是

ptr指向的内存后有足够的空间进行拓展。这种情况下,函数返回的地址仍然是ptr指向的地址。

第二种情况是

ptr指向的内存后没有足够的内存空间进行拓展。这种情况下,函数会在堆区另开辟一块空间,假如我要把一个50个字节的动态内存变成500个字节的一块空间。原50个字节的内存后面没有450个字节进行添加。那函数就会去找一块完整的500个字节的空间,并把原50个字节的数据存到新找到的内存的前50个字节中去,之后会自动销毁那原50个字节的空间。这样函数返回的地址就不再是原地址了,而是新开辟空间的地址。

第三种情况是

ptr指向的内存后没有足够的内存空间进行拓展同时函数也无法找到完整的新空间。此时函数返回NULL。

因此我们可以创建一个临时指针去接受返回值,若返回的是NULL,我们也不会丢失原先开辟的空间的地址。

这三个函数开辟的动态内存空间当我们不再需要使用时,一定要用free()函数进行释放,否则会导致内存泄漏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值