如何正确地重新分配一个calloc?

How to properly realloc a calloc?

谁能告诉我如何使用 realloc 来正确扩展 calloc?

我的期望: 所有 20 个槽的值为 0。

结果: 只有 calloc 槽的值为 0,我用 realloc 分配的那个有随机数。 output picture

#include <stdio.h>
#include <stdlib.h>
int main(){
    int *ptr;
    int i;
    int n =10;
    ptr = (int*)calloc(n, sizeof(int));    //first time allocate with calloc
    ptr = (int*)realloc(ptr,2*n*sizeof(int));  //extend with realloc
    
    for(i=0;i<2*n;i++){
        printf("ptr[%d]: %d \n", i, ptr[i]);
    }
    return 0;
}

注意: 在有人问我为什么不直接使用 calloc(20,sizeof(int)); 之前。这不是我正在编写的真实程序,这只是一个简短的演示,以便人们可以更容易地看到我的问题。我实际上打算在程序的稍后部分扩展 calloc。

我尝试 在创建此问题之前找到答案。我有 google 这个:

但我似乎找不到真正的答案(我可能错过了,真的很抱歉)。我得到的大部分答案是他们像我一样使用 realloc 来扩展 calloc,但这正是我的问题。抱歉英语不好。

C 标准不提供任何执行重新分配和清零附加内存的例程。要实现这一点,您可以通过使用 realloc 重新分配内存并使用 memset:

清除来自己实现
int *newptr = realloc(ptr, 2 * n * sizeof *newptr);
if (!newptr)
{
    fprintf(stderr, "Error, unable to allocate memory.\n");
    exit(EXIT_FAILURE);
}
ptr = newptr;
memset(ptr + n, 0, n * sizeof *ptr);
n *= 2;

您当然可以将其包装到一个例程中,比如一个名为 crealloc 的例程,然后使用它。 (与用于内存管理的库函数不同,它必须传递先前分配的大小,因为您编写的代码通常无法访问提供该大小的内存管理数据结构。)