malloc,realloc,calloc的使用场合及特点,以及malloc的实现原理

malloc:


原型 :  extern void *malloc(unsigned int num_bytes);


何时使用:当需要在内存的动态存储区中分配一块长度为num_bytes字节的连续区域时。参数num_bytes为需要的内存空间的长度,返回该区域的地址。

特点:

malloc在动态分配完内存后不对分配的内存空间初始化,里边数据是随机的垃圾数据。


实现原理:

它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿链表寻找一个大到足以满足用户请求所需要的内存 块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。



calloc


原型:void *calloc(size_t n, size_t size);


何时使用:当需要在内存的动态存储区中分配n个长度为size_t size字节的连续空间时。如果分配成功,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

特点:

calloc在动态分配完内存后,自动初始化该内存空间为零。



realloc

原型:extern void *realloc(void *mem_address, unsigned int newsize);

何时使用:当需要在已经被(malloc(), calloc(), 或realloc())分配的空间的基础上重新分配空间时。参数mem_address为原有的空间地址,newsize是重新申请的地址空间。

特点:

①传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的


②如果realloc需要的内存小于原来的内存大小,会导致数据丢失;如果原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 如果原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址


如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回NULL。而原来的内存块保持不变。


④如果newsize大小为0,那么释放mem_address指向的内存,并返回NULL。


⑤如果mem_address为NULL,则realloc()和malloc()类似。分配一个newsize的内存块,返回一个指向该内存块的指针。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: mallocrealloc和calloc都是C语言中用于动态内存分配的函数。 malloc函数用于分配指定大小的内存空间,返回指向该内存空间的指针。 realloc函数用于重新分配已经分配的内存空间的大小,返回指向该内存空间的指针。 calloc函数用于分配指定数量和大小的内存空间,并将其初始化为,返回指向该内存空间的指针。 ### 回答2: mallocrealloc、calloc 都是 C 语言中的内存分配函数。 1. malloc malloc 的函数原型为 void* malloc(size_t size),意思为分配 size 字节的内存空间,并返回这段内存的首地址。在使用 malloc 分配内存时,系统会从堆里找到一块足够大的连续空闲内存来分配。如果找到的内存空间不够,malloc 函数会返回 NULL,表示分配失败。 例如,下面的代码分配了一个含有 5 个 int 类型元素的数组内存: ``` int* ptr; ptr = (int*)malloc(5 * sizeof(int)); if (ptr == NULL) { printf("Memory allocation failed\n"); exit(1); } ``` 2. realloc realloc 的函数原型为 void* realloc(void* ptr, size_t size),意思为重新分配 ptr 指向的内存空间大小为 size,返回新的内存地址,同时原来的内存空间会被释放。如果重新分配失败,realloc 函数会返回 NULL,并不会在原空间上进行修改。 例如,下面的代码将之前分配的数组内存重新分配为含有 10 个 int 类型元素的数组内存: ``` int* ptr; ptr = (int*)malloc(5 * sizeof(int)); if (ptr == NULL) { printf("Memory allocation failed\n"); exit(1); } ptr = (int*)realloc(ptr, 10 * sizeof(int)); if (ptr == NULL) { printf("Memory reallocation failed\n"); exit(1); } ``` 3. calloc calloc 的函数原型为 void* calloc(size_t nmemb, size_t size),意思为分配 nmemb 个大小为 size 字节的内存空间,并返回这段内存的首地址。与 malloc 不同,calloc 分配的内存空间中每个字节都被初始化为 0。 例如,下面的代码分配了一个含有 5 个 int 类型元素的数组内存,并将其中的元素全部初始化为 0: ``` int* ptr; ptr = (int*)calloc(5, sizeof(int)); if (ptr == NULL) { printf("Memory allocation failed\n"); exit(1); } ``` ### 回答3: C语言中,动态内存分配是一种常见的操作。动态内存分配可以在程序运行时根据需要动态分配内存空间。为了实现动态分配内存,C语言提供了三个函数,它们分别是mallocrealloc和calloc。 1. malloc函数 malloc是memory allocation(内存分配)的缩写。该函数用于在堆中分配指定大小的内存空间,返回值为指向起始地址的指针。如果分配失败,则返回NULL。 函数原型如下: void *malloc(size_t size); 其中,size_t是一个无符号整数类型,在C语言中通常与unsigned int相同。该参数用于指定需要分配的内存大小。 2. realloc函数 reallocreallocate(重新分配)memory(内存)的缩写。该函数用于修改之前调用malloc分配的内存大小,或者在之前调用realloc分配的内存基础上进行扩充或收缩。如果分配失败,则返回NULL。 函数原型如下: void *realloc(void *ptr, size_t size); 其中,ptr是之前分配的内存块的指针,size是需要重新分配的内存块大小。 3. calloc函数 calloc是clear(清零)和allocate(分配)的缩写。和malloc一样,该函数用于在堆中分配指定大小的内存空间,但calloc会在分配空间后将其中的每个字节都设置为0。返回值为指向起始地址的指针。如果分配失败,则返回NULL。 函数原型如下: void *calloc(size_t nmemb, size_t size); 其中,nmemb表示需要分配内存的数量,size表示每个内存块的大小。 总结: mallocrealloc和calloc三个函数都用于在程序运行时动态分配内存。其中,mallocrealloc常用于分配和重新分配大小可变的内存块,而calloc常用于初始化内存块。在使用这些函数时需要注意内存泄露和指针空指针问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值