realloc如何在使用calloc分配的内存上工作?

guicsvcw  于 2023-05-06  发布在  其他
关注(0)|答案(3)|浏览(129)

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

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

如果size_2可能大于或小于size_1。如果新的大小更大,则旧的数据不会丢失,并且新分配的字节未初始化。由ptr包含的起始地址可能会改变,如果没有足够的内存在旧地址存储所有字节连续。realloc将旧块的内容移动到新块中,ptr将指向这个新块的初始字节。
但是,如果使用calloc分配内存,我无法理解realloc函数的作用。有人能简要介绍一下realloc如何在calloc分配的内存上工作吗?

k7fdbhmy

k7fdbhmy1#

我们知道malloc和calloc的内存块布局是不同的。
不,我们没有。实际上,我们知道,除了calloc()负责乘以其参数(以确定块大小)并确保分配的块使用全零位模式初始化之外,根本没有区别。
其余的如下。realloc()处理内存块的方式没有区别,不管使用什么函数来分配它。realloc()处理calloc艾德块的方式与处理malloc() ed块的方式完全相同。

41zrol4v

41zrol4v2#

我们知道malloc和calloc的内存块布局是不同的。
不,是一样的。这种说法是没有根据的。
当我们尝试使用realloc调整malloc分配的内存大小时,我们通常会这样做:
char *ptr=(char *)malloc(size_1); ptr=(char *)realloc(ptr, size_2);
[其中] size_2可以大于或小于size_1。如果新的大小更大,则旧的数据不会丢失,并且新分配的字节未初始化。如果旧地址没有足够的内存来连续存储所有字节,ptr包含的起始地址可能会更改。
是的。
realloc将旧块的内容移动到新块中
如有必要。如果块只是生长,则不需要此步骤。
并且ptr将指向该新块的初始字节。
是的。
但是,如果使用calloc分配内存,我无法理解realloc函数的作用。
一样的
有人可以给予我一个简短的概述abt realloc工程上的内存分配的calloc?
是一样的。
你想太多了calloc(n, size)可以通过malloc(n*size)后跟memset()来实现。realloc()不在乎。

dwbf0jvd

dwbf0jvd3#

malloccalloc的内存块布局不同
事实上没有。callocmalloc之间的区别是calloc()使用0值初始化分配的内存,而malloc()不初始化分配的内存,因此内存将具有未定义/垃圾数据。
和参数的数量。
我不认为reallocmalloccalloc分配的内存有什么不同。

编辑

关于你的问题:

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

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

这将按预期工作。

相关问题