我void *realloc(void *pointer, size_t size);用来增加指针的大小.realloc是如何工作的?
它是否创建了一个nre地址空间,并将旧值复制到新的地址空间并返回一个指针这个地址?或者它只是分配更多的内存并将其绑定到旧内存?
@Iraklis有正确的答案:第二个(如果它可以逃脱它)或第一个(但只有它必须).
但是,有时它既不能做也会失败.注意:如果它无法调整数据大小,它将返回NULL,但内存不会是freed.像这样的代码是错误的:
ptr = realloc(ptr, size);
Run Code Online (Sandbox Code Playgroud)
如果realloc返回NULL,旧的ptr将永远不会得到freed因为你已经用它覆盖了NULL.要做到这一点,你必须做到:
void *tmp = realloc(ptr, size);
if(tmp) ptr = tmp;
else /* handle error, often with: */ free(ptr);
Run Code Online (Sandbox Code Playgroud)
在BSD系统上,上面的内容变成了一个名为的库函数reallocf,可以按如下方式实现:
void *reallocf(void *p, size_t s)
{
void *tmp = realloc(p, s);
if(tmp) return tmp;
free(p);
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
允许您安全使用:
ptr = reallocf(ptr, size);
Run Code Online (Sandbox Code Playgroud)
请注意,如果realloc有分配新的空间和复制旧的数据,这将 free旧的数据.只有在无法调整大小的情况下,如果调整大小失败是可恢复的错误,它会使数据保持不变.
| 归档时间: |
|
| 查看次数: |
776 次 |
| 最近记录: |