如何正确地重新分配一个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 这个:
- 如何正确重新分配?
- 如何扩展 Calloc?
- 如何将realloc与calloc一起使用?
- calloc() 和 realloc() 编译问题
- 几个和上面类似。
但我似乎找不到真正的答案(我可能错过了,真的很抱歉)。我得到的大部分答案是他们像我一样使用 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
的例程,然后使用它。 (与用于内存管理的库函数不同,它必须传递先前分配的大小,因为您编写的代码通常无法访问提供该大小的内存管理数据结构。)
谁能告诉我如何使用 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 这个:
- 如何正确重新分配?
- 如何扩展 Calloc?
- 如何将realloc与calloc一起使用?
- calloc() 和 realloc() 编译问题
- 几个和上面类似。
但我似乎找不到真正的答案(我可能错过了,真的很抱歉)。我得到的大部分答案是他们像我一样使用 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
的例程,然后使用它。 (与用于内存管理的库函数不同,它必须传递先前分配的大小,因为您编写的代码通常无法访问提供该大小的内存管理数据结构。)