calloc、malloc、realloc函数的区别

参考:realloc、malloc、以及calloc函数的区别_逐梦男孩-CSDN博客
三者都是分配内存,都是stdlib.h库里的函数

文章目录

      • malloc
      • calloc
      • realloc

malloc

原型:

void* malloc (size_t size);

size为要申请的空间大小
常见使用方式:

int *p = (int *)malloc(20*sizeof(int));

一般需要将返回的void*指针进行强制类型转换为所需类型指针。
示例:

/* malloc example: random string generator*/
#include   /* printf, scanf, NULL */
#include  /* malloc, free, rand */

int main()
{
    int i, n;
    char *buffer;

    printf("How long do you want the string? ");
    scanf("%d", &i);

    buffer = (char *)malloc(i + 1);
    if (buffer == NULL)
        exit(1);

    for (n = 0; n < i; n++)
        buffer[n] = rand() % 26 + 'a';
    buffer[i] = '\0';

    printf("Random string: %s\n", buffer);
    free(buffer);

    return 0;
}

输出:
calloc、malloc、realloc函数的区别_第1张图片

calloc

原型:

void* calloc (size_t num, size_t size);

比malloc函数多一个参数,如果要申请20个int型空间,会 int *p = (int *)calloc(20, sizeof(int))。

还有一点是malloc申请后的空间里值是随机的,没有初始化,而calloc申请后会对空间逐一进行初始化,并设置值为0。所以其实calloc有两个操作:分配内存+初始化

测试:

/* calloc example */
#include 
#include   /* printf, scanf, NULL */
#include  /* calloc, exit, free */

int main()
{
    int i;
    int *pData;
    printf("Amount of numbers to be entered: ");
    scanf("%d", &i);
    pData = (int *)calloc(i, sizeof(int));
    if (pData == NULL)
        exit(1);
    printf("You have entered: ");
    for (int n = 0; n < i; n++)
        printf("%d ", pData[n]);
    std::cout << std::endl;
    free(pData);
    return 0;
}

输出:
calloc、malloc、realloc函数的区别_第2张图片
可以看到会进行值的初始化为0。

realloc

realloc函数和上面两个有本质的区别

原型:

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

用于对动态内存进行扩容(及已申请的动态空间不够使用,需要进行空间扩容操作),ptr为指向原来空间基址的指针, new_size为接下来需要扩充容量的大小。

你可能感兴趣的:(面试/笔试,c++,malloc)