免费注册 查看新帖 |

Chinaunix

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

大家帮我比较下这两段程序,是有关malloc的,先谢啦! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-13 14:51 |只看该作者 |倒序浏览
《understanding unix/linux programming-a guide to theory and practice》-Bruce Molay著(中文版)
清华大学出版社出版。第239页有一段程序如下:


  1. char* makestring(char* buf){
  2.         //trim off newline and create storage for the string
  3.         char *cp,*malloc();
  4.        
  5.         buf[strlen(buf)-1]='\0';//trim newline
  6.         [color=Green]cp=malloc(strlen(buf)+1);//get memory[color]
  7.        
  8.         if(cp==NULL){
  9.                 fprintf(stderr,"no memory\n");
  10.                 exit(1);
  11.         }
  12.         strcpy(cp,buf);//copy chars
  13.         return cp;//return ptr
  14. }
复制代码


编译时会上面绿色那句会提示说“错误:与 ‘malloc’ 类型冲突”。而我参考《C陷阱和缺陷》也是这么写的。

后来我改成了如下代码,编译通过,但不知有何异同和是否正确:
  1. char* makestring(char* buf){
  2.         //trim off newline and create storage for the string
  3.         char *cp;
  4.        
  5.         buf[strlen(buf)-1]='\0';//trim newline
  6.         cp=malloc(strlen(buf)+1);//get memory
  7.        
  8.         if(cp==NULL){
  9.                 fprintf(stderr,"no memory\n");
  10.                 exit(1);
  11.         }
  12.         strcpy(cp,buf);//copy chars
  13.         return cp;//return ptr
  14. }
复制代码


ps:环境是ecplise+fc5,谢谢!

论坛徽章:
0
2 [报告]
发表于 2006-06-13 14:53 |只看该作者

回复 1楼 neobob 的帖子

编译时上面绿色那句:
   是指:cp=malloc(strlen(buf)+1);//get memory

论坛徽章:
0
3 [报告]
发表于 2006-06-13 15:30 |只看该作者
在 linux 里面,malloc 函数原型是宣告在 stdlib.h 内,内容为:

  1. void *calloc(size_t nmemb, size_t size);
复制代码


所以你原本第一个程式码片段叙述写的

  1. char *cp,*malloc();
复制代码


这个另外的宣告是没有必要的,再者可能会引起问题。所以你引入 stdlib.h 即可。

而你原本程式码部分,一般会这样写:

  1. cp=(char *) malloc(strlen(buf)+1); //get memory
复制代码


==

论坛徽章:
0
4 [报告]
发表于 2006-06-13 18:35 |只看该作者

回复 3楼 kenduest 的帖子

谢啦!

stdlib.h已经引入。
cp=(char *) malloc(strlen(buf)+1); 与cp=malloc(strlen(buf)+1);在结果上好像没有什么差别,但是不知道在内存等方面会不会有差别?同样感谢!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2006-06-13 21:39 |只看该作者
cp=(char *) malloc(strlen(buf)+1); 前面的 (char *) 在引入了 void * 后就纯属多余(当然在此处加上也没啥));
另外, char *malloc() 在包含了 <stdlib.h> 后就不但多余, 而且还会出问题.
当然, 前提是C 编译器和库支持C89.

楼主还是多看点较新较好的关于 C 的书吧

[ 本帖最后由 MMMIX 于 2006-6-13 21:44 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-06-14 11:20 |只看该作者
buf[strlen(buf)-1]='\0';//trim newline
这句是有问题的,如果buf[0]==0,就会变成buf[-1]='\0',存在内存的非法写操作的问题的。

可以试运行这个程序就知道了,怎么越界操作的

main()
{
char buf1[4];
char buf2[4];
char buf3[4];

buf1[0]=0;
printf("buf1_add=%X,buf2_add=%X,buf3_add=%X\n",buf1,buf2,buf3);
printf("buf2-1=%X\n",buf2-1);
memset(buf1,'1',4);
//memset(buf2,'3',4);
memset(buf3,'3',4);
printf("buf1[0]=%02X\n",buf1[0]);
printf("buf1[1]=%02X\n",buf1[1]);
printf("buf1[2]=%02X\n",buf1[2]);
printf("buf1[3]=%02X\n",buf1[3]);
printf("\n");
printf("buf3[0]=%02X\n",buf3[0]);
printf("buf3[1]=%02X\n",buf3[1]);
printf("buf3[2]=%02X\n",buf3[2]);
printf("buf3[3]=%02X\n",buf3[3]);
//printf("len=%d",strlen(buf)-1);

buf2[0]=0;
buf2[strlen(buf2)-1]='\0';//造成内存越界的地方,是一个重大的bug

printf("\n");
printf("buf1[0]=%02X\n",buf1[0]);
printf("buf1[1]=%02X\n",buf1[1]);
printf("buf1[2]=%02X\n",buf1[2]);
printf("buf1[3]=%02X\n",buf1[3]);
printf("\n");
printf("buf3[0]=%02X\n",buf3[0]);
printf("buf3[1]=%02X\n",buf3[1]);
printf("buf3[2]=%02X\n",buf3[2]);
printf("buf3[3]=%02X\n",buf3[3]);//此处的值从0x33被非法改了成0x00了

}

[ 本帖最后由 ccjjhua 于 2006-6-14 11:45 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2006-06-15 00:01 |只看该作者
楼主有一个错误,申请的内存没有经过初始化就开始使用,这样会出现一些意料不到的错误的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP