realloc 实现原理
时间: 2023-11-03 20:13:58 浏览: 92
`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` 函数后重新赋值。
相关问题
编译器内存分配实现原理
编译器内存分配实现原理如下:
1.栈内存分配:在函数调用时,编译器会为每个函数调用分配一块栈内存,用于存储函数的参数、局部变量和返回地址等信息。栈内存的分配和释放是由编译器自动完成的,无需手动管理。
2.堆内存分配:堆内存的分配和释放需要手动管理,通常使用malloc、calloc、realloc等函数进行分配。这些函数会在堆上分配一块指定大小的内存,并返回指向该内存块的指针。堆内存的释放需要使用free函数进行释放,否则会导致内存泄漏。
3.全局变量和静态变量的内存分配:全局变量和静态变量的内存分配是在程序启动时完成的,它们的内存空间在程序的整个生命周期中都存在,直到程序结束才会被释放。
malloc 的底层实现原理
malloc的底层实现原理是通过系统调用函数brk()或mmap()来实现动态内存分配。当申请的内存大小小于128k时,malloc会调用brk()函数来移动指针_enddata来开辟空间;当申请的内存大小大于128k时,malloc会调用mmap()函数来在虚拟地址空间中找一块空间来开辟。在内存释放时,malloc会调用free()函数来释放内存空间。此外,malloc还可以使用calloc()和realloc()函数来动态申请和调整内存空间大小。其中,calloc()函数会将申请的内存空间初始化为0,而realloc()函数则是对动态开辟空间大小的调整。
阅读全文