C语言-内存相关函数:malloc、free、calloc、realloc

添加头

需要添加头信息

#include <stdlib.h>

malloc

C语言提供了一个动态内存开辟的函数,在stdlib.h 头文件中。函数原型如下:

void* malloc (size_t size);

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。size — 内存块的大小,以字节为单位,

  1. 此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。如果分配成功则返回指向被分配内存的指针),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

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

free

对应malloc,C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,在stdlib.h 头文件中。函数原型如下:

void free (void* ptr);

free函数用来释放动态开辟的内存。如果参数ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。如果参数ptr 是NULL指针,则函数什么事都不做。释放ptr后要将ptr及时指向NULL指针。

例子


void TEST1()
{
    int num = 0;
    scanf("%d",&num);

    int* ptr = NULL;
    ptr = (int*)malloc(num * sizeof(int));
    if (ptr != NULL)
    {
        int i = 0;
        for (i = 0; i < num; i++)
        {
            *(ptr + i) = 0;
        }
    }
    free(ptr);
    ptr = 0;
}

calloc

C语言还提供了一个函数叫calloc , calloc 函数也用来动态内存分配。malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。num — 要被分配的元素个数,size — 元素的大小,原型如下:

void* calloc (size_t num, size_t size);

函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0。与函数malloc 的区别只在于calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

例子


void TEST2()
{
    int* p = NULL;
    p = (int*)calloc(10, sizeof(int));
    if (p != NULL)
    {
        //使用空间
    }
    free(p);
    p = 0;
}

realloc

重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。

应用场景:内存不够时,可通过该函数扩展、缩小内存

提示:malloc() + memset() 函数 执行效率更高

void* realloc (void* ptr, size_t size);

例子


void TEST3()
{
    int* p = NULL;
    p = (int*)malloc(100);
    if (p != NULL)
    {
        //使用空间
    }
    else
    {
        exit(EXIT_FAILURE);
    }

    int* ptr = NULL;
    ptr = (int *)realloc(p,100);
    if (ptr != NULL)
    {
        p = ptr;        //指针要还给p
    }
    free(p);
    p = NULL;
}

感谢:
https://blog.csdn.net/RMA515T/article/details/115251035


原文出处:http://malaoshi.top/show_1IX3FIywzFUd.html