小心误用C语言的free()函数

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

#include <stdio.h>

#include <string.h>

#include <malloc.h>

int main()

{

char *p = (char *)malloc(6);

if(NULL == p)

{

printf("内存分配失败! ");

return -1;

}

else

{

memset(p, 0, 6);

strcpy(p, "12345");

*(p + 5) = '';

while( ('4' != *p) && ('' != *p) )

{

p++;

}

free(p);

}

return 0;

}

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

小心误用C语言的free()函数

我奇了个怪的!

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

好了,找到原因了,那就修改下程序吧。一种解决方法是使用另一个C语言指针变量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("内存分配失败! ");

return -1;

}

else

{

q = p;

memset(p, 0, 6);

strcpy(p, "12345");

*(p + 5) = '';

while( ('4' != *q) && ('' != *q) )

{

q++;

}

free(p);

}

return 0;

}

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 8,848评论 3 44
  • 几种语言的特性 汇编程序:将汇编语言源程序翻译成目标程序编译程序:将高级语言源程序翻译成目标程序解释程序:将高级语...
    囊萤映雪的萤阅读 8,068评论 1 5
  • 姓名:李涛 学号:17021211100 转载自http://mp.weixin.qq.com/s/YUXrJbi...
    关公面前叠飞机阅读 5,442评论 1 9
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 7,643评论 0 73
  • 因为生活进入不同阶段,开始不断给自己定目标,加压力,再也不敢像大学一样无忧无虑,单纯的泡图书馆,过级,考证。开始学...
    陈鑫淼阅读 3,255评论 0 1

友情链接更多精彩内容