当我们尝试使用
malloc
调整 realloc
分配的内存大小时,我们通常这样做:
char *ptr = (char *)malloc(size_1);
ptr = (char *)realloc(ptr, size_2);
如果
size_2
可能大于或小于size_1
。如果新大小更大,则旧数据不会丢失,并且新分配的字节未初始化。如果旧地址没有足够的内存来连续存储所有字节,则 ptr
包含的起始地址可能会更改。 realloc
将旧块的内容移动到新块中,ptr
将指向这个新块的初始字节。
但是,如果使用
calloc
分配内存,我无法理解 realloc
函数的作用。有人可以给我一个关于realloc
如何在calloc
分配的内存上工作的简要概述吗?
我们知道 malloc 和 calloc 的内存块布局是不同的
不,我们没有。实际上,我们知道除了
calloc()
负责乘以其参数(以确定块大小)并确保分配的块以全零位模式初始化之外,没有任何区别。
其余的如下。
realloc()
处理内存块的方式没有区别,无论使用什么函数分配它。 realloc()
处理 calloc
ed 块的方式与处理 malloc()
ed 块的方式完全相同。
我们知道 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()
不在乎。
内存块布局对于
和malloc
是不同的calloc
其实没有。
calloc
和 malloc
之间的区别是 calloc()
用 0 值初始化分配的内存,而 malloc()
不初始化分配的内存,因此内存将有未定义/垃圾数据。
还有参数的数量。
我不认为
realloc
对待由 malloc
或 calloc
分配的内存不同。
关于你的问题:
a = calloc(5,sizeof(int));
if (a == NULL)
{
printf("Error in allocating memory");
}
a = realloc(a,7); // Also check its return.
这将按预期工作。