免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: M.I.X
打印 上一主题 下一主题

[函数] 曾面试时被问:strcpy函数为什么要返回指针? [复制链接]

论坛徽章:
0
61 [报告]
发表于 2007-08-06 09:27 |只看该作者
原帖由 flw2 于 2007-8-6 09:26 发表


strcpy(a,c)好像比你的更简洁呀

效果不一样

论坛徽章:
0
62 [报告]
发表于 2007-08-06 09:28 |只看该作者
strcpy(a.c);
strcpy(b,c);

可读性也不差。

就好比
a=b=c;


a=c;
b=c;

我觉得区别不大

论坛徽章:
0
63 [报告]
发表于 2007-08-06 09:30 |只看该作者
突然想到,strcpy返回值的设计是否也有为了遵循统一设计的需要?str类函数基本上都是返回指针的,象strchr之类的,只能返回指针,所以strcpy也就返回指针了,既然是返回嘛,当然返回目的。
有点象POSIX定义的函数,大多返回0或负值。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
64 [报告]
发表于 2007-08-06 10:00 |只看该作者
原帖由 快乐的土豆 于 2007-8-6 09:45 发表

我知道那个strcpy的源代码是直接在dest的后面增加,可能很不幸,src是如此的巨大(或者本身ram太小),且根据编译器的实现,恰好不会被dest的增长所覆盖,导致内存溢出崩溃。
这是我所能猜测的strcpy可能出错 ...

抱歉,没看懂你的意思。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
65 [报告]
发表于 2007-08-06 10:14 |只看该作者
原帖由 快乐的土豆 于 2007-8-6 10:09 发表

dest可扩展的空间太小,src太大,这个肯定是要算做失败的。

dest是你传入的参数,在调用的时候已经决定大小了,
可扩展是怎么回事?

论坛徽章:
0
66 [报告]
发表于 2007-08-06 10:17 |只看该作者
原帖由 快乐的土豆 于 2007-8-6 10:09 发表

dest可扩展的空间太小,src太大,这个肯定是要算做失败的。

就算是这样,strcpy又怎么得知dest的大小呢?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
67 [报告]
发表于 2007-08-06 11:15 |只看该作者
原帖由 快乐的土豆 于 2007-8-6 11:09 发表
可扩展的意思是:从c语言的角度来看,完全是可以这么strcpy的--不是编译错误(但是可能会抛出运行期错误).的确,看不到显式的内存申请语句,但是dest的确是需要更多的内存还容纳src--(这样c语言不认为是错误,反而认为 ...

你能不能给一个小例子出来,
光看你说,我很晕。
我还是不知道你想表达什么意思。
c标准里规定了,如果dest的空间不够容纳
src的,那么行为是未定义的。
是不是你认为标准规定的不合理,
应改成:“如果dest的空间不够容纳
src的,应该能够自动扩展空间或者报告错误?”

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
68 [报告]
发表于 2007-08-06 11:55 |只看该作者
原帖由 快乐的土豆 于 2007-8-6 11:52 发表
char c[4];
char b[4];
char a[8];
strcpy(a,"aaaaaaa");
strcpy(c,"c");
strcpy(b,a);
printf("a=%s\n",a);
printf("b=%s\n",b);
printf("c=%s\n",c);

编译运行环境:vc6  window2003

毫无疑问,目前,在我们的机器上,这是一段能编译,运行的代码.
而且大家都认为,这没有什么不妥.( )

不知道“大家”里面包括我吗?
如果包括我的话,你调查过我的意见吗?
我觉得,这非常不妥。

论坛徽章:
0
69 [报告]
发表于 2007-08-06 11:55 |只看该作者
C的主要目的就是为了获得和汇编差不多的高效率,以适合系统程序设计。

如果自动扩展dest空间,也不复杂,进入函数时候用strlen(src), 再给参数dest_len, 不够自动扩展。但这样函数用户可以自己写,不能进入C库中。

能自动判断扩展的函数的效率一下就低的太多了--而用户自己保证不需要扩展可以获得高效率。

还有超长字符串(比如几十K以上)在一个写的好的C程序中没有。一行可以作为string, 一个文件就不能做。除非写程序的人故意做而不管程序的效率和技巧。



原帖由 快乐的土豆 于 2007-8-6 11:09 发表
可扩展的意思是:从c语言的角度来看,完全是可以这么strcpy的--不是编译错误(但是可能会抛出运行期错误).的确,看不到显式的内存申请语句,但是dest的确是需要更多的内存还容纳src--(这样c语言不认为是错误,反而认为 ...

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
70 [报告]
发表于 2007-08-06 12:01 |只看该作者
原帖由 快乐的土豆 于 2007-8-6 12:00 发表

这种越界写的代码多如牛毛,很多c的教材里面都有(当然,我没法给出哪本教材里面的哪一段).

越说我越糊涂了,
难道这是一个很常用的技巧吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP