当我们尝试使用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
分配的内存工作的简要概述吗?
答案 0 :(得分:8)
我们知道malloc和calloc的内存块布局是不同的。
不,我们没有。实际上,我们知道除了calloc()
负责将其参数相乘(确定块大小)并确保分配的块用全零位模式初始化之外,根本没有区别。
其余的如下。 realloc()
处理内存块的方式没有区别,无论用什么函数分配它。 realloc()
处理calloc
ed块的方式与处理malloc()
ed块的方式完全相同。
答案 1 :(得分:2)
malloc和calloc的内存块布局不同
实际上没有。calloc
和malloc
之间的差异是 -
calloc() initializes the allocated memory with 0 value.
而
malloc() initializes the allocated memory with garbage values.
参与其中的论据数量。
我不认为realloc
对malloc
或calloc
分配的内存的处理方式不同。
关于你的问题 -
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()
并不关心。