realloc如何处理使用calloc分配的内存?

时间:2015-08-08 04:56:44

标签: c malloc dynamic-memory-allocation realloc calloc

当我们尝试使用SELECT I.[IdeaID], I.Title, I.Description, I.Status, I.DateCreated, sum(case when votes.IdeaID is null then 0 else 1 end) as ideaVoteCount, case when exists(Select 1 from Votes where userid=@userid and ideaid=I.ideaid) then 1 else 0 end as voteexists FROM Idea I LEFT JOIN Votes on (I.IdeaID = Votes.IdeaID) GROUP BY I.IdeaID, I.Title, I.Description, I.Status, I.DateCreated, votes.ideaid 调整malloc分配的内存大小时,我们通常会这样做:

realloc

如果char *ptr = (char *)malloc(size_1); ptr = (char *)realloc(ptr, size_2); 可能大于或小于size_2。如果新大小较大,则旧数据不会丢失,新分配的字节未初始化。如果旧地址处没有足够的内存来连续存储所有字节,则size_1包含的起始地址可能会发生变化。 ptr将旧块的内容移动到新块中,realloc将指向此新块的初始字节。

但是,如果使用ptr分配内存,我无法理解calloc函数的行为方式。有人可以给我一个关于realloc如何对realloc分配的内存工作的简要概述吗?

3 个答案:

答案 0 :(得分:8)

  

我们知道malloc和calloc的内存块布局是不同的。

不,我们没有。实际上,我们知道除了calloc()负责将其参数相乘(确定块大小)并确保分配的块用全零位模式初始化之外,根本没有区别。

其余的如下。 realloc()处理内存块的方式没有区别,无论用什么函数分配它。 realloc()处理calloc ed块的方式与处理malloc() ed块的方式完全相同。

答案 1 :(得分:2)

  

malloc和calloc的内存块布局不同

实际上没有。callocmalloc之间的差异是 -

  calloc() initializes the allocated memory with 0 value.

  malloc() initializes the allocated memory with garbage values.

参与其中的论据数量。

我不认为reallocmalloccalloc分配的内存的处理方式不同。

修改

关于你的问题 -

a=calloc(5,sizeof(int));

if(a==NULL)
 {
    printf("Error in allocating memory");
  }
a=realloc(a,7);  // also check its return.

这将按预期工作。

答案 2 :(得分:2)

  

我们知道malloc和calloc的内存块布局是不同的。

没有。这是相同的。这种说法没有根据。

  

当我们尝试使用realloc调整malloc分配的内存时,我们通常会这样做:

char *ptr=(char *)malloc(size_1); ptr=(char *)realloc(ptr, size_2);

  

[where] size_2可能大于或小于size_1。如果新大小较大,则旧数据不会丢失,新分配的字节未初始化。如果旧地址没有足够的内存来连续存储所有字节,则ptr包含的起始地址可能会改变。

正确。

  

realloc将旧块的内容移动到新块

如有必要。如果块只是生长了,那么这个步骤是不必要的。

  

和ptr将指向这个新块的初始字节。

正确。

  

但是,如果使用calloc分配内存,我无法理解realloc函数的行为。

同样的。

  

有人可以给我一个简短的概述abt realloc对calloc分配的内存有效吗?

它是一样的。

你正在过度思考这个问题。 calloc(n, size)只需malloc(n*size)后跟memset()即可实现。 realloc()并不关心。