| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1650 人关注过本帖
标题:代码是实现 strdup 函数功能的,但是有个错误,写得太渣,求指教
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
作业,要求没告诉你这个函数具体有什么功能的吗?按照你上面写的,有漏洞哩。

授人以渔,不授人以鱼。
2014-08-22 19:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看看帮助文档:

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册



授人以渔,不授人以鱼。
2014-08-22 19:15
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
目前俺有点错乱了,到底是C写的C++,还是C++写的C了,呵呵

梦想拥有一台龙芯3A-4000
2014-08-22 19:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
首先你要明白这个函数是干什么的,才能写好,这就是现实中所谓的“需求分析”,需求不清晰,写出来的程序必定有瑕疵。

strdup()函数,从名字上看就知道。str,是string,即字符串,这很明显;dup,是duplicate,其翻译是“完全一样的复制品”,即“克隆”。duplicate,不是虚复制,它是要切切实实地创造出一个实体,这个实体与原先是一模一样的,但又绝不是同一个,亦即不是用影像、指针回指自身这种虚假手段获得,就如生产上,要求真的制造出另一个完全一样的产品,除了物理实体不同,其余全部相同。换到程序设计上,这种要求就是要创造出另一个字符串实体!

由于字符串是临时克隆出来的,所以新的字符串一定不可能存在于栈上,迫使你必须用堆分配,这就是实现中必然用到malloc()的原因。也就是说,源字符串可能在栈上,或者在常量只读数据区(比如ROM)中,但克隆出来的产品,却一定在堆上,是可以修改的——很明显,这针对只读数据而来。由于用了malloc()堆分配,所以必然要考虑内存申请失败的可能性;另一方面,malloc()申请的堆空间,必须记得释放,这是前面我反复说明的道理,帮助文档中也强调了这一点。

授人以渔,不授人以鱼。
2014-08-22 19:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
C++兼容C,但C不兼容C++,亦即可以用C++编译器写C程序,在面向过程的本质上说,哪怕用C++语法写的也是C程序,两者的区别不是语法。

根据微软的命名规则和文档说明,函数命名为_strdup(),用下划线开头,表明这个函数是与具体实现有关的,标准不会规定具体怎么实现,只是提出要求,如何实现要求是库函数提供者的自由,所以微软的命名是这样(Linux中没有下划线)。Linux或gcc中由于有所谓的动态数组概念,这个函数的具体实现未必与微软一样在堆上申请内存,这个我就不清楚了——但就传统做法而言,必定如34楼分析所言般考虑在堆上分配的,事实上旧的系统都是这样。动态数组一直是gcc编译器的非标准扩展功能,在C99之后才被纳入标准范畴,但微软不接纳这点,所以,如果要与旧的系统兼容,你最好不用太新的标准。

授人以渔,不授人以鱼。
2014-08-22 19:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用l3456在2014-8-22 10:45:12的发言:

#include
#include
#include
char* _sF(char* s, int len)
 {
char* F = (char*)malloc(sizeof(char) * len);
for(int i = 0; i < len; i++)
 {
     F = s;
 }
 F[len] = '\0';
return F;
 }
int main()
 {
     char *s="hello";
     char *d;
     d=_sF(s,strlen(s));
     printf("%s",d);
     free(d);
     return 0;
 }
改后的代码,谢谢大家的解答

你这个程序确实不需要用string头的,函数中也不需要传入两个参数(参考文档中库函数的原型),字符串的结束可以用遇到'\0'来判断。需要传递数组尺寸的场合,是内存块不是cz字符串的时候,比如拷贝或克隆一整块内存的时候,由于该块内存可能包含多个'\0'字符,才采用for(<length)的方式循环,否则对cz字符数组,用for(!='\0')循环就可以了。

顺便说一下,你分配的空间小了。


[ 本帖最后由 TonyDeng 于 2014-8-22 20:05 编辑 ]

授人以渔,不授人以鱼。
2014-08-22 19:58
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
这个是什么错误啊!!!

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-23 14:54
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
Debug Error
DAMAGE:after Normal block(#51)at 0x005C0E18

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-23 14:56
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
free去掉了,就没有上面那个error

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-23 14:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不知道是怎么回事

授人以渔,不授人以鱼。
2014-08-24 12:30
快速回复:代码是实现 strdup 函数功能的,但是有个错误,写得太渣,求指教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026527 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved