如果我重新分配calloc指针会得到什么结果?

时间:2017-03-25 18:00:58

标签: c dynamic-memory-allocation realloc

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保持内存包含零,但新创建的内存包含零或垃圾值。

  
    

如果零提供realloc如何知道天气,则使用malloc或calloc创建ptr。

  

1 个答案:

答案 0 :(得分:3)

即使您正确地调用了realloc(没有强制转换结果并将其分配回来或它无法正常工作):

ptr = realloc(ptr,20*sizeof(int));

(有些人可能会认为它不安全,因为realloc可以返回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的结果,因为它似乎有效,直到操作系统需要将内存移动到另一个块,在这种情况下,您的ptr指针变为无效,并且您有未定义的行为。