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

问题描述 投票:0回答:3

当我们尝试使用

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
分配的内存上工作的简要概述吗?

c malloc dynamic-memory-allocation realloc calloc
3个回答
10
投票

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

不,我们没有。实际上,我们知道除了

calloc()
负责乘以其参数(以确定块大小)并确保分配的块以全零位模式初始化之外,没有任何区别。

其余的如下。

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


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()
不在乎。


2
投票

内存块布局对于

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.

这将按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.