如果我重新分配 calloc 指针,结果会怎样?
what will be the result if i reallocating the calloc pointer?
int main()
{
int *ptr = (int*)calloc(10,sizeof(int));//allocating memory for 10 integers
ptr = realloc(ptr,20*sizeof(int)); //reallocating the memory for 20 integers
free(ptr);
return 0;
}
最初 ptr 保持内存包含零,但新创建的内存包含零或垃圾值。
If zeros present how can realloc know weather the ptr is created using malloc or calloc.
即使您正确地调用了 realloc
(没有转换结果并将其分配回去,否则它无法正常工作):
ptr = realloc(ptr,20*sizeof(int));
(有些人可能会说它不安全,因为 realloc
可以 return NULL
从而失去对 ptr
的引用)
事实并非如此。它只是重新分配 而没有 将其余部分设置为 0
您必须使用 memset
手动将剩余内存设置为 0。
我会做:
int *ptr_new = realloc(ptr,20*sizeof(int));
if (ptr_new == NULL) { /* print error, free(ptr) and exit: no more memory */ }
else
{
// set the end of memory to 0
memset(ptr_new+10,0,sizeof(int)*10);
...
注意:一个常见的错误是 而不是 分配回 realloc
的结果,因为它似乎有效,直到 OS 需要将内存移动到另一个块,在这种情况下,您的 ptr
指针变得无效并且您有未定义的行为。
int main()
{
int *ptr = (int*)calloc(10,sizeof(int));//allocating memory for 10 integers
ptr = realloc(ptr,20*sizeof(int)); //reallocating the memory for 20 integers
free(ptr);
return 0;
}
最初 ptr 保持内存包含零,但新创建的内存包含零或垃圾值。
If zeros present how can realloc know weather the ptr is created using malloc or calloc.
即使您正确地调用了 realloc
(没有转换结果并将其分配回去,否则它无法正常工作):
ptr = realloc(ptr,20*sizeof(int));
(有些人可能会说它不安全,因为 realloc
可以 return NULL
从而失去对 ptr
的引用)
事实并非如此。它只是重新分配 而没有 将其余部分设置为 0
您必须使用 memset
手动将剩余内存设置为 0。
我会做:
int *ptr_new = realloc(ptr,20*sizeof(int));
if (ptr_new == NULL) { /* print error, free(ptr) and exit: no more memory */ }
else
{
// set the end of memory to 0
memset(ptr_new+10,0,sizeof(int)*10);
...
注意:一个常见的错误是 而不是 分配回 realloc
的结果,因为它似乎有效,直到 OS 需要将内存移动到另一个块,在这种情况下,您的 ptr
指针变得无效并且您有未定义的行为。