C语言中的realloc函数动态分配内存

本文详细解析了realloc函数的工作原理,包括内存减少、扩大情况下的操作细节及返回值意义,强调正确处理realloc后的指针变化,避免常见的错误用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然现在说这个。。多半没有什么意思。。但我的确在很长的一段时间不知道他的工作原理。。

所以随便记录下。。

它的原型是:

  1. extern void * realloc(void * __ptr,size_t __size);  

第一个参数是为试图更改大小的原堆文件,size为新的内存大小。

1.如果内存减少,则仅改变下索引信息,但并不代表被减少的部分内存还可以安全访问,这己经释放。

2.如果扩大内存空间,则返回情况如下:

 (1),如果当前内存段后面拥有需要的内存空间,则直接扩展这段内存空间,返回原指针

   (2),如果当前内存段后面的空闲字节不够,那么就使用堆中第一个能够满足这一要求的内存块,

将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存位置指针

  (3)如果申请失败,返回NULL,此时原来的指针仍有效。、、


因此调用时会返回新的指针,应该判断,而原来指针会释放,不需要重新手动释放,因此下面的使用方式不好:

ptr = realloc (ptr , new_size);


摘抄自:linux高级程序设计



http://blog.youkuaiyun.com/blank_bird/article/details/6766792
`realloc` 函数是 C 标准库中的一个重要内存管理函数,用于动态调整之前分配的内存块大小。它的声明位于 `<stdlib.h>` 中。 ### `realloc` 的基本语法 ```c void *realloc(void *ptr, size_t new_size); ``` #### 参数说明: - **`ptr`**:指向先前通过 `malloc()`、`calloc()` 或 `realloc()` 分配的内存区域的指针。如果传入的是 `NULL`,则 `realloc()` 行为等同于 `malloc(new_size)`,即分配新的内存并返回其地址。 - **`new_size`**:指定新分配内存空间的字节数。若该值小于原有内存,则多余部分会被截断;若大于原尺寸,则会尝试扩充。当设置为0时,并非所有平台都保证释放内存(尽管大多数情况下如此),因此最好显式地调用 free() 来释放不再需要的空间。 #### 返回值: - 成功时返回一个新的指向已重新分配(可能移动了位置)后的内存区块的指针; - 如果请求失败或试图将 NULL 指针作为第一个参数传递并且无法分配所需内存量,则返回 NULL 并保持原始缓冲区不变。 ### 使用示例: 假设我们有一个整型数组,最初只包含三个元素... ```c int main(){ int i; // 初始分配可以存储3个整数的空间 int* arr = (int*) malloc(3 * sizeof(int)); for(i=0; i<3; ++i){ arr[i] = i + 1; } printf("Before realloc:\n"); for(i=0; i<3; ++i) { printf("%d ", arr[i]); } putchar('\n'); // 尝试增加到5个元素 arr = (int *)realloc(arr, 5*sizeof(int)); if(!arr){ // Check if reallocation failed. puts("Memory reallocation failed."); return -1; } else { // 初始化新增加的部分 for(; i<5; ++i) arr[i]=-(i+1); printf("After realloc:\n"); for(i=0; i<5; ++i) { printf("%d ", arr[i]); } } free(arr); // 最终记得释放内存 } ``` 此程序首先创建了一个只能容纳三名成员的小队列,然后通过 `realloc` 扩展它以接受两个额外成员,并初始化它们各自的负数值表示法。 请注意,在实际应用中应当检查每次从 `realloc` 接收的结果是否成功以及处理潜在错误情况下的资源清理工作,避免造成内存泄漏或其他异常状况发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值