免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2487 | 回复: 8
打印 上一主题 下一主题

请教各位一个问题 为什么我malloc 228个字节的时候释放就会出错啊 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-13 13:58 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){
   if(argc!=2){
      printf("error\n";
      exit(0);
   }
   char *p;
   int size=strlen("test"*sizeof(char)+sizeof(char)*strlen(argv[1]);
   printf("size=%d\n",size);
   p=(char *)malloc(size);
   if(p==NULL){
      printf("malloc error";
      exit(1);
   }
   memset(p,0,size );
   sprintf(p,"test%s",argv[1]);
   printf("%s\n",p);
   free(p);
   return 0;
}
这个是我的代码

./test =sdfsdfsdfkjahdfaksyhdkanckjzhsciuqydfaskhdaksdkasjdhasklfhsdkajhfiusadfhsjkadfhkasjdfnkdjlhafksfhjksadfhwaeuifhskdafhkjaslfashfklshafklsjhfuwiahdsakjdfhkjldfafhksdfsdfsdfsdfsdfssdfsdfsdfsdfsdfssdfsdfsdfsdddsfsdfdfsdfssdfghj
我这样就会出错
*** glibc detected *** ./test: double free or corruption (!prev): 0x096ab008 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x6ef591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde[0x6f0de8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x6f3ecd]
./test[0x804862c]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x69abd6]
./test[0x80484c1]
======= Memory map: ========
00110000-00111000 r-xp 00000000 00:00 0          [vdso]
001f1000-0020e000 r-xp 00000000 08:01 1050709    /lib/libgcc_s.so.1
0020e000-0020f000 r--p 0001c000 08:01 1050709    /lib/libgcc_s.so.1
0020f000-00210000 rw-p 0001d000 08:01 1050709    /lib/libgcc_s.so.1
0034d000-00368000 r-xp 00000000 08:01 1050651    /lib/ld-2.11.1.so
00368000-00369000 r--p 0001a000 08:01 1050651    /lib/ld-2.11.1.so
00369000-0036a000 rw-p 0001b000 08:01 1050651    /lib/ld-2.11.1.so
00684000-007d7000 r-xp 00000000 08:01 1055047    /lib/tls/i686/cmov/libc-2.11.1.so
007d7000-007d8000 ---p 00153000 08:01 1055047    /lib/tls/i686/cmov/libc-2.11.1.so
007d8000-007da000 r--p 00153000 08:01 1055047    /lib/tls/i686/cmov/libc-2.11.1.so
007da000-007db000 rw-p 00155000 08:01 1055047    /lib/tls/i686/cmov/libc-2.11.1.so
007db000-007de000 rw-p 00000000 00:00 0
08048000-08049000 r-xp 00000000 08:01 262726     /home/mmxcq/c/test
08049000-0804a000 r--p 00000000 08:01 262726     /home/mmxcq/c/test
0804a000-0804b000 rw-p 00001000 08:01 262726     /home/mmxcq/c/test
096ab000-096cc000 rw-p 00000000 00:00 0          [heap]
b7700000-b7721000 rw-p 00000000 00:00 0
b7721000-b7800000 ---p 00000000 00:00 0
b785f000-b7860000 rw-p 00000000 00:00 0
b786e000-b7871000 rw-p 00000000 00:00 0
bf919000-bf92e000 rw-p 00000000 00:00 0          [stack]
Aborted

好像字母上的意思是说两次释放 但是我只释放了一次
./test =sdfsdfsdfkjahdfaksyhdkanckjzhsciuqydfaskhdaksdkasjdhasklfhsdkajhfiusadfhsjkadfhkasjdfnkdjlhafksfhjksadfhwaeuifhskdafhkjaslfashfklshafklsjhfuwiahdsakjdfhkjldfafhksdfsdfsdfsdfsdfssdfsdfsdfsdfsdfssdfsdfsdfsdddsfsdfdfsdfssdfghjsdfsdfsd这样就不会出错  不知道具体原因 请教各位朋友 谢谢了

论坛徽章:
0
2 [报告]
发表于 2010-09-13 14:00 |只看该作者
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){
   if(argc!=2){
      printf("error\n");
      exit(0);
   }
   char *p;
   int size=strlen("test")*sizeof(char)+sizeof(char)*strlen(argv[1]);
   printf("size=%d\n",size);
   p=(char *)malloc(size);
   if(p==NULL){
      printf("malloc error");
      exit(1);
   }
   memset(p,0,size );
   sprintf(p,"test%s",argv[1]);
   printf("%s\n",p);
   free(p);
   return 0;
}

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2010-09-13 14:05 |只看该作者
少申请了一个字节,需要0结尾

论坛徽章:
0
4 [报告]
发表于 2010-09-13 14:08 |只看该作者
少申请了一个字节,需要0结尾
hellioncu 发表于 2010-09-13 14:05

你好 字符串需要0结尾 那比如说其他类型了 比如int 之类 的申请需不需要+1谢谢

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2010-09-13 14:09 |只看该作者
你好 字符串需要0结尾 那比如说其他类型了 比如int 之类 的申请需不需要+1谢谢
mmxcq 发表于 2010-09-13 14:08



    不需要

论坛徽章:
0
6 [报告]
发表于 2010-09-13 14:17 |只看该作者
不需要
hellioncu 发表于 2010-09-13 14:09

谢谢哈 我一直以为是系统自动添加一个字节  呵呵

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2016-05-27 06:20:00数据库技术版块每日发帖之星
日期:2016-06-04 06:20:00数据库技术版块每日发帖之星
日期:2016-06-23 06:20:00
7 [报告]
发表于 2010-09-13 14:55 |只看该作者
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){
   if(argc!=2){
      printf("error\n");
      exit(0);
   }
   char *p;
   int size=strlen("test")*sizeof(char)+sizeof(char)*strlen(argv[1]);
   printf("size=%d\n",size);

   p=(char *)malloc(size);
   
   if(p==NULL){
      printf("malloc error");
      exit(1);
   }
   memset(p, 'A',size);
   //sprintf(p,"%s",argv[1]);
   printf("%s",p);  //这里输出p的内容,为什么程序多次执行c:\test.exe testtt,出现莫名奇妙的字符呢?
   free(p);
   return 0;
}


C:\proc>ma.exe testttt
size=11
AAAAAAAAAAAME=Co         // 这里为什么输出ME=Co,metset我是初始为'A'的呀?
C:\proc>ma.exe testtttt
玸ize=12                   //这里出现莫名奇妙的字符
AAAAAAAAAAAAtion  //这里问题跟上面输出一样,多了tion.

论坛徽章:
0
8 [报告]
发表于 2010-09-13 15:14 |只看该作者
memset(p, 'A',size);
换成memset(p, 0,size);试试

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2016-05-27 06:20:00数据库技术版块每日发帖之星
日期:2016-06-04 06:20:00数据库技术版块每日发帖之星
日期:2016-06-23 06:20:00
9 [报告]
发表于 2010-09-13 15:46 |只看该作者
memset(p, 'A',size);
换成memset(p, 0,size);试试
mmxcq 发表于 2010-09-13 15:14



memset(p, 0,size)的话,p的内容为空呀,我想测试的是将p的内容全填'A',然后输出呀。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP