0
点赞
收藏
分享

微信扫一扫

关于动态分配函数(malloc,free,collocation,realloc)的面试中的问题详解

惠特曼 2022-04-17 阅读 27

 下面来介绍动态内存分配函数相关应用
头文件stdlib.h

1.介绍第一个malloc函数
其函数原型为void * malloc(unsigned int size);
其作用是在内存的动态存储区中分配一个长度为size的连续空间。
返回值:是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
#include<iostream>
using namespace std;
int main()
{
    int* p = (int*)malloc(4);
    if (p == NULL)
        cout << "空间申请失败";
    else
    {
        for (int j = 0; j < 4; j++)
        {
            *p = j;
            cout << *p;
            p++;
        }
        free(p);
        p = NULL;
    }
}
2.下面介绍free函数原型: void free(void *ptr)
专门是用来做动态内存的释放和回收的。
功能 : 释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,
以后可在调用malloc、realloc以及calloc函数来再分配。
!!!并不是将ptr置为NULL,所以调用free时,紧接着将ptr=NULL,防止错误使用ptr
举例见上。
3.下面介绍colloc函数
函数原型:void * calloc(unsigned int num,unsigned int size);
功能:在内存的动态存储区中分配num个长度为size的连续空间,函数返回一个指向分配起始地址的指针;
如果分配不成功,返回NULL。
功能:在内存的动态存储区中分配num个长度为size的连续空间;
注意:num:对象个数,size:对象占据的内存字节数,
相较于malloc函数,calloc函数会自动将内存初始化为0;
函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int* p = (int*)calloc(10, sizeof(int));
    if (NULL != p)
    {
        //使用
    }
    free(p);
    p = NULL;
    return 0;
}
4.下面介绍realloc函数
原型:void* realloc(void*ptr,unsigned int size)
指针名 = (数据类型 * )realloc(要改变内存大小的指针名,新的大小)。
新的大小可大可小:
如果新的大小大于原内存大小,则新分配部分不会被初始化;
假如原来的内存后面还有足够多剩余内存的话,realloc的内存 = 原来的内存 + 剩余内存,realloc还是返回原来内存的地址;
假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉, realloc返回新内存的地址
如果新的大小小于原内存大小,可能会导致数据丢失
#include <stdio.h>
int main()
{
    int* ptr = (int*)malloc(100);
    if (ptr != NULL)
    {
        //使用空间;
    }
    else
    {
        exit(1);
    }
    //扩展容量
    ptr = (int*)realloc(ptr, 1000);//这样可以吗?(如果申请失败会如何?)
    //这样不可以,正确如下操作:
    int* p = NULL;
    p = (int*)realloc(ptr, 1000);
    if (p != NULL)
    {
        ptr = p;
    }
    //业务处理
    free(ptr);
    ptr = NULL;
    return 0;

举报

相关推荐

0 条评论