free()函数释放一段分配的内存之陷阱

朋友们对malloc函数应该是比较熟悉了,此函数功能是分配一段内存地址,并且将内存地址给一个指针变量,最后记得再调用free函数释放这段内存地址就可以了,标准的流程对吧,好像没什么问题。但是按照此标准流程,下面的程序却有个奇怪的现象:

#include <stdio.h> 
#include <string.h>
#include <malloc.h>
 
int main() 
{ 
    char *p = (char *)malloc(6); 
 
    if(NULL == p) 
    { 
        printf("内存分配失败!\n"); 
        return -1; 
    } 
    else 
    { 
        memset(p, 0, 6); 
        strcpy(p, "12345"); 
        *(p + 5) = '\0';
 
        while( ('4' != *p) && ('\0' != *p) ) 
        { 
            p++; 
        } 
 
        free(p); 
    } 
 
    return 0; 
} 

程序不难,功能就是使用malloc函数分配一段内存空间,用于存放6个字符数据”123456“,最后使用free函数来释放这段内存地址。可是一运行结果就报错了,如下:



我奇了个怪的!
调试吧!调着调着,我了个去,我发现malloc函数分配的这一段内存空间的起始地址是”0x00382c88“,也就是说指针变量p的值是”
0x00382c88“,地址为”0x00382c88“的一段内存存放着字符‘1’。经过while循环后,指针变量p指向字符‘4’了,而字符‘4’在内存中的地址是”0x00382c8b“,也就是指针p的值是”0x00382c8b“。此时跳出while循环,紧接着调用free函数,我的原意是想释放从”0x00382c88“开始的内存区域,现在变成释放了从”0x00382c8b“开始的内存区域,因此报了这个错!

好了,找到原因了,那就修改下程序吧。一种解决方法是使用另一个指针变量q, q初始也指向字符‘1’,在while循环中使用指针变量q而不是p,程序修改如下:

#include <stdio.h> 
#include <string.h>
#include <malloc.h>
 
int main() 
{ 
    char *p = (char *)malloc(6); 
    char *q = NULL;
 
    if(NULL == p) 
    { 
        printf("内存分配失败!\n"); 
        return -1; 
    } 
    else 
    { 
        q = p;
        memset(p, 0, 6); 
        strcpy(p, "12345"); 
        *(p + 5) = '\0';
 
        while( ('4' != *q) && ('\0' != *q) ) 
        { 
            q++; 
        } 
 
        free(p); 
    } 
 
    return 0; 
}  

这样,在while循环中指针变量q最终指向字符‘4’,而指针变量p依然指向字符‘1’,也就是指针变量p的值依旧是”0x00382c88“,也就是分配的内存的起始地址! 

本文代码是在微软的VC6.0上编译与运行。

转载于:https://www.cnblogs.com/itblog/p/7236569.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值