有关free()函数的一个问题
2012-12-21 15:39
232 查看
1.源码
结果:
2.分析原因
char *test1;
test1 = (char *)malloc(8);//在堆中分配动态内存
test1 = "adbdefg";//"adbdefg"为常量,存储在TEXT存储区域;试图释放该内存会导致异常
free(test1);//使用free函数去释放一个TEXT只读区域内存,程序肯定异常
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ char *test1; test1 = (char *)malloc(8); printf("test1 addr is 0x%lx\n",test1); strncpy(test1,"adbdefg",7); //test1 = "adbdefg"; printf("test1 addr is 0x%lx\n",test1); printf("test1 addr is 0x%lx\n",test1); printf("test1 is %s\n",test1); printf("test1 size is %d\n",sizeof(*test1)); printf("test1 addr size is %d\n",sizeof(test1)); free(test1); test1 = NULL; return 0; }gcc -o test test.c
结果:
test1 addr is 0x255b010 test1 addr is 0x255b010 test1 addr is 0x255b010 test1 is adbdefg test1 size is 1 test1 addr size is 8如果//test1 = "adbdegf"放通,strncpy那句屏蔽;结果如下:
test1 addr is 0x11cd010 test1 addr is 0x400751 test1 addr is 0x400751 test1 is adbdefg test1 size is 1 test1 addr size is 8 *** glibc detected *** ./testt: free(): invalid pointer: 0x0000000000400751 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x7ae16)[0x7fc54434ee16] /lib/x86_64-linux-gnu/libc.so.6(cfree+0x6c)[0x7fc5443530fc] ./testt[0x400640] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fc5442f530d] ./testt[0x4004c9] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 08:07 21086431 /home/lianxi/c++/testt 00600000-00601000 r--p 00000000 08:07 21086431 /home/lianxi/c++/testt 00601000-00602000 rw-p 00001000 08:07 21086431 /home/lianxi/c++/testt 011cd000-011ee000 rw-p 00000000 00:00 0 [heap] 7fc540000000-7fc540021000 rw-p 00000000 00:00 0 7fc540021000-7fc544000000 ---p 00000000 00:00 0 7fc5440be000-7fc5440d3000 r-xp 00000000 08:05 2050760 /lib/x86_64-linux-gnu/libgcc_s.so.1 7fc5440d3000-7fc5442d2000 ---p 00015000 08:05 2050760 /lib/x86_64-linux-gnu/libgcc_s.so.1 7fc5442d2000-7fc5442d3000 r--p 00014000 08:05 2050760 /lib/x86_64-linux-gnu/libgcc_s.so.1 7fc5442d3000-7fc5442d4000 rw-p 00015000 08:05 2050760 /lib/x86_64-linux-gnu/libgcc_s.so.1 7fc5442d4000-7fc54446d000 r-xp 00000000 08:05 2048322 /lib/x86_64-linux-gnu/libc-2.13.so 7fc54446d000-7fc54466c000 ---p 00199000 08:05 2048322 /lib/x86_64-linux-gnu/libc-2.13.so 7fc54466c000-7fc544670000 r--p 00198000 08:05 2048322 /lib/x86_64-linux-gnu/libc-2.13.so 7fc544670000-7fc544671000 rw-p 0019c000 08:05 2048322 /lib/x86_64-linux-gnu/libc-2.13.so 7fc544671000-7fc544677000 rw-p 00000000 00:00 0 7fc544677000-7fc544698000 r-xp 00000000 08:05 2048320 /lib/x86_64-linux-gnu/ld-2.13.so 7fc54486f000-7fc544872000 rw-p 00000000 00:00 0 7fc544894000-7fc544897000 rw-p 00000000 00:00 0 7fc544897000-7fc544898000 r--p 00020000 08:05 2048320 /lib/x86_64-linux-gnu/ld-2.13.so 7fc544898000-7fc54489a000 rw-p 00021000 08:05 2048320 /lib/x86_64-linux-gnu/ld-2.13.so 7fffd2e0f000-7fffd2e30000 rw-p 00000000 00:00 0 [stack] 7fffd2f54000-7fffd2f55000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 已放弃
2.分析原因
char *test1;
test1 = (char *)malloc(8);//在堆中分配动态内存
test1 = "adbdefg";//"adbdefg"为常量,存储在TEXT存储区域;试图释放该内存会导致异常
free(test1);//使用free函数去释放一个TEXT只读区域内存,程序肯定异常
相关文章推荐
- 一个有关js函数执行顺序的问题,未解决...
- 有关继承中虚函数的一个问题
- 一个有关扑克牌牌型分析的问题
- 一个有关扑克牌牌型分析的问题
- 关于《程序员编程宝典》中编写一个函数,作用是把一个char组成的字符串循环右移n位的问题
- 最近在使用sps类库过程中发现了一个让我比较疑惑的问题(有关items属性的)
- 困扰了好几天的一个问题,为存储过程或函数指定的参数太多
- MFC 如何解决多个按钮响应一个函数的问题
- 多年困扰我的一个技术问题,希望这方面的专家指点一下,有关SQLServer并发控制方面的问题
- golang1.7 关于CGO的一个小问题:C.free使用.
- 一个与小球碰撞有关的有趣问题
- 一个小sql的问题记录 对分析函数的应用
- 一个比较简单的c-free问题
- 网易面试题之小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求
- 解决两个Fragment间调用addToBackStack()函数,按返回键直接退出的问题(即无法切换回上一个Fragment)
- 一个snprintf函数format参数的问题
- 一个函数引发的MySQL驱动问题
- 一个关于js所有函数都报错的问题
- [疑问]作了一个用Js遍历树节点的函数,后来发现一个问题!
- 面试OR笔试40——二分查找一个函数解决多个问题