在c中使用realloc

时间:2011-03-16 07:49:45

标签: c++ c

我使用void *realloc(void *pointer, size_t size);来增加指针的大小。 realloc是如何工作的? 它是否创建了一个nre地址空间,并将旧值复制到新的地址空间并返回一个指针这个地址?或者它只是分配更多的内存并将其绑定到旧内存?

5 个答案:

答案 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)

你滥用“地址空间”一词。进程的所有内存都存在于单个地址空间中。程序未使用的内存,其全局变量及其堆栈称为“堆”。 mallocrealloc(以及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。简而言之,是的,它会分配更多的内存,让你的内容保持不变;如果必须移动内存,则复制内容。当然,您可以指定较短的大小,在这种情况下,它会修剪分配的内存,同样保持内容不变。