动态内存申请库函数:malloc,calloc,realloc

  我们经常会使用C语言中的库函数会在堆上进行动态内存的申请,至于malloc,calloc,realloc这三个库函数有什么共同点和异同点,今天就来仔细聊聊。

共同点:

  • 都是C语言中用来在堆上申请动态内存空间的库函数,当然了,在C++中依旧可以正常使用。
  • 如果申请空间成功,返回空间首地址,如果失败则返回NULL。在使用时,申请之后一定要记得判断是否申请成功。
  • 返回值类型是 void*,接收返回值的时候,需要进行强制类型转换。
  • 空间用完之后,一定要手动free来释放内存。

不同点:

malloc:

void* malloc (size_t size);
char* buffer = (char*) malloc (10);

if (buffer==NULL) return 0;

free (buffer);
  • 分配连续内存块
  • 分配一块内存大小为size字节的块,并返回一个指向该块开头的指针。将其强制转换为所需的数据指针类型,以便对其解引用。
  • 新分配的内存块的内容未初始化,值不确定
  • 如果size为零,则返回值取决于特定的库实现(它可以是空指针,也可以不是空指针),但是不得对返回的指针进行解引用。
  • 参数:申请的空间所占总的字节数
  • 可使用空间大小受用户申请大小限制
  • malloc在分配内存的时候会保留一定的空间用来记录分配情况,分配的次数越多,这些记录占用的空间就越多。另外,根据malloc实现策略的不同,malloc每次在分配的时候,可能分配的空间比实际要求的多一些,多次分配会导致更多的这种浪费,所以我们要尽量避免多次分配小空间,尽量一次性分配大空间。

calloc:

void* calloc(size_t num,size_t size);
int* pData = (int*) calloc (10,sizeof(int));

if (buffer==NULL) return 0;

free (pData);
  • 分配内存块
  • 如果size为零,则返回值取决于特定的库实现(它可以是空指针,也可以不是空指针),但是不得对返回的指针进行解引用。
  • num:要分配的元素数,size:每个元素的大小(字节长)。
  • 分配了一个初始化为0的 num*size 字节存储块。
  • 可使用空间大小受用户申请大小限制

realloc:

void* realloc (void* ptr, size_t size);
int* numbers = NULL;
int* more_numbers = (int*) realloc (numbers, 10 * sizeof(int));
  • 更改ptr指向的内存块的大小,将其调整到size字节。
  • 返回值是指向重新分配的存储块的指针,该指针可以与ptr相同,也可以是新位置。
  • 判断ptr指向的空间是否在堆上,不在则程序运行错误。
  • 如果ptr是空指针,则该函数的行为类似于malloc,分配一个新的大小为size的块,并返回一个指向其开头的指针。申请失败返回NULL。
  • 如果新大小等于原来大小,什么都不干。如果新大小比原来小,则会有数据丢失。如果新大小比原来大,大一点,则在原空间后面继续申请,如果够,依旧返回原空间首地址,如果新空间比原来大得多,原空间后面不够,则重新申请一块size的新空间,将原空间内容浅拷贝过去,释放旧空间,返回新空间地址。申请失败返回NULL。
  • 如果函数未能分配所请求的内存块,则返回空指针,并且不会释放由参数ptr指向的内存块(它仍然有效,并且其内容不变)。
  • 如果返回值为NULL,要么是因为空间分配失败,要么是因为size是零。
  • C++98:如果size为零,则先前在ptr处分配的内存将被释放,释放完成后,返回空指针。
  • C++11: 如果size为零,则返回值取决于特定的库实现(它可以是空指针,也可以不是空指针),但是不得对返回的指针进行解引用。

总结:
1.初始化区别和参数区别
  malloc函数不能初始化所分配的内存空间,calloc函数会将所分配的内存空间都初始化为零。请求数量的方式不同,calloc的参数包括所需元素的数量和每个元素的字节,根据这些值可以计算出总共需要分配的内存空间。
2.功能上的区别
  malloc与calloc用来动态分配内存空间,而realloc则是对给定的指针所指向的内存空间进行扩大或者缩小。

越努力,越幸福!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这些函数都是在C语言中用来动态分配内存函数,它们的特点如下: 1. alloca函数:是一个非标准的函数,它分配内存的方式与malloc不同,它是在栈上分配内存,所以内存的生命周期是与函数的生命周期相同的。使用alloca分配的内存不需要手动释放,在函数返回时会自动释放。 2. malloc函数:是标准库函数,用于在堆上分配指定大小的内存。使用完成后需要手动释放,否则会导致内存泄漏。 3. calloc函数:也是标准库函数,用于在堆上分配指定大小的内存,并且将其初始化为0。使用完成后需要手动释放,否则会导致内存泄漏。 4. realloc函数:是标准库函数,用于重新分配已经分配的内存大小。如果之前分配的内存不足以满足新的内存需求,realloc会重新分配一块更大的内存,并将原有内存中的内容复制到新分配的内存中。使用完成后需要手动释放,否则会导致内存泄漏。 ### 回答2: alloca、malloccalloc和relloca是在C语言中用于动态内存分配的函数。 alloca是C语言中的一个可变分配内存函数。它是在栈上分配内存的,用于动态地创建一个连续的内存块。它的特点是不需要手动释放内存,当函数返回时自动释放。但是,由于在栈上分配内存,它的内存分配和释放速度比较快,但分配的内存大小有限。 malloc是C语言中常用的动态内存分配函数。它在堆上分配内存,可以动态地创建任意大小的内存块。它的特点是需要手动释放内存,通过调用free函数来释放内存。由于在堆上分配内存,其分配和释放速度比较慢,但可以分配较大的内存空间。 calloc是C语言中另一个动态内存分配函数。它在堆上分配内存,并将分配的内存块清零。它的特点是需要手动释放内存,通过调用free函数来释放内存。与malloc相比,calloc适用于创建数组或矩阵等需要初始化的数据结构,因为可以保证分配的内存块全部为0。 relloca是一种特殊的动态内存分配函数,它在堆上重新分配内存。它的特点是可以增大或减小已分配内存块的大小。如果需要调整已分配内存块的大小,可以使用relloc函数,它会分配一个新的内存块,并将原有内存块的内容拷贝到新的内存块,然后释放原内存块。需要注意的是,使用realloc时需要特别小心,因为当无法满足大小调整时,它会返回NULL。 这些函数的特点不同,选择使用哪个函数取决于具体的需求和场景。 ### 回答3: alloca、malloccallocrealloc都是用于在内存中分配空间的函数: 1. alloca函数: alloca函数用于在栈上分配空间,该空间在函数调用结束后自动释放,不需要手动释放。它的特点如下: - alloca是计算栈帧大小的一部分,速度较快。 - 分配的内存空间是在栈上,所以不需要显式释放内存。 - 分配的内存空间是连续的,在函数调用结束后会被自动释放。 - 分配的内存空间大小限制较小。 2. malloc函数malloc函数用于在堆上分配指定大小的内存空间,并返回一个指向该内存空间的指针。它的特点如下: - 分配的内存空间是在堆上,需要手动释放。 - 分配的内存空间大小不受限制,可以根据需要动态调整。 - 由于需要维护堆的空闲内存链表,所以执行速度相对较慢。 3. calloc函数calloc函数用于在堆上分配指定数量和大小的连续内存空间,并将其初始化为零。它的特点如下: - 分配的内存空间是在堆上,需要手动释放。 - 分配的内存空间大小不受限制,可以根据需要动态调整。 - 分配的内存空间会被初始化为零。 - 适用于需要分配并初始化一块连续内存空间的情况。 4. realloc函数realloc函数用于重新分配已有内存块的大小,可以扩大或缩小。它的特点如下: - 分配的内存空间是在堆上,需要手动释放。 - 可以扩大或缩小已有内存块的大小。 - 如果重新分配的大小比原有大小大,会尝试在原有内存块后续位置进行扩展;如果重新分配的大小比原有大小小,会截断内存块。 - 可能导致内存拷贝或内存移动,效率较低。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值