当我们尝试使用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
分配的内存上工作吗?
3条答案
按热度按时间k7fdbhmy1#
我们知道malloc和calloc的内存块布局是不同的。
不,我们没有。实际上,我们知道,除了
calloc()
负责乘以其参数(以确定块大小)并确保分配的块使用全零位模式初始化之外,根本没有区别。其余的如下。
realloc()
处理内存块的方式没有区别,不管使用什么函数来分配它。realloc()
处理calloc
艾德块的方式与处理malloc()
ed块的方式完全相同。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()
不在乎。dwbf0jvd3#
malloc
和calloc
的内存块布局不同事实上没有。
calloc
和malloc
之间的区别是calloc()
使用0值初始化分配的内存,而malloc()
不初始化分配的内存,因此内存将具有未定义/垃圾数据。和参数的数量。
我不认为
realloc
对malloc
或calloc
分配的内存有什么不同。编辑
关于你的问题:
这将按预期工作。