realloc 的原理
时间: 2023-10-26 13:57:16 浏览: 139
`realloc` 函数用于重新分配已经分配的内存空间的大小。它的原理如下:
1. `realloc` 首先检查传入的指针是否为 `NULL`。如果是 `NULL`,则等效于 `malloc`,分配新的内存空间,并返回指向该内存空间的指针。
2. 如果传入的指针不为 `NULL`,则 `realloc` 首先需要确定是否有足够的连续内存空间来满足所需大小。
3. 如果有足够的连续内存空间,则 `realloc`会在原始内存块中进行重新分配,将原始数据复制到新分配的内存块中,然后释放原始内存块,并返回指向新分配内存块的指针。
4. 如果没有足够的连续内存空间,则 `realloc`会尝试在堆中寻找新的连续内存空间,并将原始数据复制到新分配的内存块中。如果找到了适合的内存空间,则释放原始内存块,并返回指向新分配内存块的指针。
5. 如果无法找到适合的连续内存空间,则 `realloc`会返回 `NULL`,表示重新分配失败,原始内存块保持不变。
需要注意的是,`realloc` 可能会导致数据复制,这可能会带来一定的性能开销。因此,如果在预先知道需要多大内存空间的情况下,建议使用 `malloc` 分配初始内存空间,以避免不必要的数据复制。此外,重新分配内存空间时,原始指针可能会被释放,因此在使用 `realloc` 返回的新指针之前,应该小心处理原始指针的引用。
相关问题
realloc 实现原理
`realloc` 函数用于重新分配已经分配的内存块的大小,其原型为:
```c
void *realloc(void *ptr, size_t size);
```
其中,`ptr` 是指向已分配内存块的指针,`size` 是新的内存块大小。该函数会返回一个新的指针,指向重新分配后的内存块。如果无法重新分配,则返回 `NULL`。
`realloc` 函数的实现原理如下:
1. 如果 `ptr` 为 `NULL`,则等价于调用 `malloc(size)`。
2. 如果 `size` 为 0,则等价于调用 `free(ptr)`。
3. 如果新的内存块大小 `size` 小于或等于原来的大小,则不进行任何操作,直接返回原来的指针 `ptr`。
4. 如果新的内存块大小 `size` 大于原来的大小,则需要进行重新分配。此时有两种情况:
- 如果原来的内存块后面有足够的空闲空间,可以直接扩展原来的内存块,然后返回原来的指针 `ptr`。
- 如果原来的内存块后面没有足够的空闲空间,则需要重新分配一个新的内存块,并将原来的数据复制到新的内存块中,最后释放原来的内存块,然后返回新的指针。
由于 `realloc` 函数可能会重新分配内存块,因此它可能会导致已存在的指向该内存块的指针变为无效指针。因此,在使用 `realloc` 函数时,需要注意保存指向该内存块的所有指针,并在调用 `realloc` 函数后重新赋值。
Linux C替换realloc函数
在Linux C编程中,`realloc()`是一个非常实用的库函数,用于动态调整已经分配的内存块大小。当你需要改变先前malloc()或calloc()返回的内存块大小时,`realloc()`就派上用场了。这个函数接收两个参数:一个是之前分配的内存块地址(`void *ptr`),另一个是新的大小(`size_t new_size`)。
`realloc()`的工作原理是:
1. 如果指针`ptr`为空,`realloc()`会像`malloc()`一样分配新内存。
2. 如果指针不为空并且`new_size`小于当前内存块的大小,它会尝试截断内存,返回新的指针,并删除剩余部分。
3. 如果`new_size`大于当前内存块的大小,`realloc()`会在原内存块后面扩展空间,并将原始数据移动到新位置,然后返回新的指针。
4. 如果内存分配失败(例如内存不足),`realloc()`会返回`NULL`,此时应该检查并处理这个错误。
需要注意的是,`realloc()`并不会释放原始内存,即使新的大小比原来的小。如果不想保留旧的内存区域,你应该使用`free(ptr)`提前释放它,然后再重新分配。
阅读全文