我使用void *realloc(void *pointer, size_t size);
来增加指针的大小。 realloc是如何工作的?
它是否创建了一个nre地址空间,并将旧值复制到新的地址空间并返回一个指针这个地址?或者它只是分配更多的内存并将其绑定到旧内存?
答案 0 :(得分:5)
@Iraklis有正确的答案:第二个(如果它可以逃脱它)或第一个(但只有它必须)。
然而,有时它既不能做,也会失败。注意:如果无法调整数据大小,它将返回NULL
,但内存将 NOT 为free
d。像这样的代码是错误的:
ptr = realloc(ptr, size);
如果realloc
返回NULL
,旧ptr
将永远不会free
,因为您已使用NULL
覆盖了void *tmp = realloc(ptr, size);
if(tmp) ptr = tmp;
else /* handle error, often with: */ free(ptr);
。要做到这一点,你必须这样做:
reallocf
在BSD系统上,上面的内容变成了一个名为void *reallocf(void *p, size_t s)
{
void *tmp = realloc(p, s);
if(tmp) return tmp;
free(p);
return NULL;
}
的库函数,可以按如下方式实现:
ptr = reallocf(ptr, size);
允许您安全使用:
realloc
请注意,如果free
必须分配新空间并复制旧数据,那么将 {{1}}旧数据。只有在无法调整大小的情况下,如果调整大小失败是可恢复的错误,它会使数据保持不变。
答案 1 :(得分:3)
这取决于!如果它无法调整内存区域的大小,那么它会分配一个新的记忆区域,复制旧数据并释放旧内存。
答案 2 :(得分:2)
你滥用“地址空间”一词。进程的所有内存都存在于单个地址空间中。程序未使用的内存,其全局变量及其堆栈称为“堆”。 malloc
和realloc
(以及calloc
,只是malloc
并且清除)从堆中分配内存。 realloc
的大多数实现将检查是否有足够的(size
字节)可用空间从pointer
开始(必须指向先前由malloc
或{{1分配的块) - realloc
知道该块有多大),如果是这样,只需增加在realloc
给定的位置分配的块的大小并返回,而不进行复制。如果没有足够的空间,它将相当于pointer
...也就是说,它会分配一个足够大的块来保存newptr = malloc(size); memcpy(newptr, pointer, size_of_old_block); free(pointer); return newptr;
字节,在size
复制数据到那个块,释放旧块,并返回新块的地址。
答案 3 :(得分:0)
我认为答案是函数取决于请求的大小和可用堆。
从程序员的角度来看,我认为我们得到保证的是,如果新分配成功,pointer
为非空。因此,指针可以保持不变,即使它现在指向由size_t
表示的更大的内存块。
答案 4 :(得分:0)
Realloc不会改变指针的大小,指针的大小在同一架构上总是相同的。它会更改指针指向的已分配内存的大小。它的工作方式如下所述:http://msdn.microsoft.com/en-us/library/xbebcx7d.aspx。简而言之,是的,它会分配更多的内存,让你的内容保持不变;如果必须移动内存,则复制内容。当然,您可以指定较短的大小,在这种情况下,它会修剪分配的内存,同样保持内容不变。