关于strcpy函数的疑问

pzp 2006-11-09 05:29:13
这是网上面试题原型
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL)) //[1]
throw "Invalid argument(s)"; //[2]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}

这个是strcat.c中的原型
char * __cdecl strcpy(char * dst, const char * src)
{
char * cp = dst;

while( *cp++ = *src++ )
; /* Copy src over dst */

return( dst );
}

我对上面的代码存在一个疑问,即while( *cp++ = *src++ )这个循环什么时候能跳出来,另外这种循环while( *cp++ = *src++ )为什么不会出现内存引用异常,括号内的做法是:*cp=*src,src++,cp++;对cp和src的使用不用判断内存越界吗?
...全文
256 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rambo_yzw 2006-11-10
  • 打赏
  • 举报
回复
之前做过一个笔试题要求写一个你认为最无懈可击的strcpy(),显然C函数库要做到的并不是无懈可击,合适就行了
shootingsyh 2006-11-10
  • 打赏
  • 举报
回复
c就是他妈的这样,谁也没办法……
pzp 2006-11-10
  • 打赏
  • 举报
回复
我试了一下,发现他妈的真不检查。会抛出异常。
lann64 2006-11-09
  • 打赏
  • 举报
回复
是的,c库函数多数实现版本不做这个检查,因为做这些检查跟C的精神不符。C要高效率运行,并且相信程序员知道自己要干什么,因此是否要检查越界就是程序员的责任。系统对指针不检查,数组也不检查。
lujun5100 2006-11-09
  • 打赏
  • 举报
回复
这个,指针也要检查越界的吗,数组才检查吧

具体的不清楚,系统会抛出异常,到底是怎么抛出地,还真不知道
pzp 2006-11-09
  • 打赏
  • 举报
回复
while( *cp++ = *src++ )这里是赋值语句,那么判断的就是 *cp 是否为0,在字符串末尾, 是\0 字符, 该字符的 ascii码是0, 退出循环
---------------------------------------------------------------
( *cp++ = *src++ ) 我认为只有cp比src空间大时才不会出现异常,否则还没退出cp所指向的指针就已经是非法的了,我这样认为有没有错?


为什么不会出现内存引用异常
--------------
当然会出现,不过那是使用者的事,用的时候检查
--------------------------------------------
难道C语言库函数不做指针引用异常检查?任由函数崩溃?
lann64 2006-11-09
  • 打赏
  • 举报
回复
while( *cp++ = *src++ )这个循环什么时候能跳出来
----------------------
读到串尾'\0'就结束了。

为什么不会出现内存引用异常
--------------
当然会出现,不过那是使用者的事,用的时候检查
jixingzhong 2006-11-09
  • 打赏
  • 举报
回复
while( *cp++ = *src++ )

这里是赋值语句,
那么判断的就是 *cp 是否为0,
在字符串末尾, 是\0 字符, 该字符的 ascii码是0, 退出循环
jixingzhong 2006-11-09
  • 打赏
  • 举报
回复
遇到 \0 退出

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧