realloc的常见错误

原型 :extern void *realloc(void *mem_address, unsigned int newsize);

 

我们一般的用法是:

 

char *p;

p = (char * ) malloc (10);

if(!p) return ERROR;

//realloc

p = (char * ) realloc (p,20); //ERROR

if(!p) return ERROR;

 

错误就在 realloc, 如果realloc分配失败,原来申请的10个字节将无法释放,导致内存泄漏;

 

正确的写法是:

 

char *p, *q;

p = (char * ) malloc (10);

if(!p) return ERROR;

//realloc

q = p;//先保存P

p = (char * ) realloc (p,20); //ERROR

if(!p) {

    free(q);

    return ERROR;

}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
realloc函数用于重新分配之前通过malloc、calloc或realloc函数分配的内存块的大小。它的使用方法如下: 1. 首先,声明一个指针变量,指向要重新分配内存的内存块。 2. 调用realloc函数,将指针变量作为第一个参数传入,将新的大小作为第二个参数传入。 3. realloc函数会根据新的大小重新分配内存块,并返回一个指向重新分配后内存块的指针。 4. 如果realloc函数成功分配了新的内存块,原来的指针变量将指向新的内存块,可以继续使用。 5. 如果realloc函数失败,返回NULL指针,表示重新分配内存失败。 需要注意的是,使用realloc函数重新分配内存时,原来的内存块中的数据可能会被复制到新的内存块中。因此,在使用realloc函数重新分配内存后,应该检查返回的指针是否为NULL,以确保内存分配成功。如果返回的指针为NULL,表示内存分配失败,应该处理错误情况。 示例代码如下: ``` #include <stdio.h> #include <stdlib.h> int main() { int* p = (int*)malloc(5 * sizeof(int)); // 分配一个包含5个int类型元素的内存块 if (p == NULL) { printf("malloc fail!"); exit(-1); } // 使用内存块 int* new_p = (int*)realloc(p, 10 * sizeof(int)); // 重新分配内存块的大小为10个int类型元素 if (new_p == NULL) { printf("realloc fail!"); exit(-1); } // 使用重新分配后的内存块 free(new_p); // 释放内存块 return 0; } ``` 在上面的示例代码中,首先使用malloc函数分配了一个包含5个int类型元素的内存块,然后使用realloc函数将内存块的大小重新分配为10个int类型元素。最后,使用free函数释放了内存块。 #### 引用[.reference_title] - *1* *2* *3* [【动态内存管理】malloc,calloc,realloc的使用方法以及常见错误](https://blog.csdn.net/m0_65679465/article/details/127038921)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值