读书人

while( *des++ = *src++ );这样有甚么

发布时间: 2012-02-04 15:43:09 作者: rapoo

while( *des++ = *src++ );这样有甚么隐患吗
上面是strcpy里面的一个实现, 以前在资料中看到该做法有些隐患, 并做了笔记, 但是今天笔记找不到了, 所以...

[解决办法]
前面应加句:
assert((src != NULL) && (des != NULL));会好些
[解决办法]
*des++ = *src++
如果des的长度短,则可能会造成内存越界
[解决办法]
主要是担心指针指向不可预知区域!
[解决办法]
char *strcpy(char*des,const char*src)
{
assert(des&&src);
char *address=des;
while((*des++=*src++)== '\0 '))
;
retrun address;
}
[解决办法]
楼上的代码是不是有点问题?
[解决办法]
可能会越界的,应该考虑这种情况
[解决办法]
应该就考虑越界的问题
[解决办法]
主要就是考虑内存越界的问题
[解决办法]
七、函数体中的指针或引用常量不能被返回

Char *func(void)

{

char str[]=”Hello Word”;

//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉

return str;

}

函数体内的指针变量并不会随着函数的消亡而自动释放
http://community.csdn.net/Expert/topic/5329/5329316.xml?temp=.7365686
char *strcpy(char*des,const char*src)
{
assert(des&&src);
char *address=des;
while((*des++=*src++)== '\0 '))
;
retrun address;
}
[解决办法]
学习
[解决办法]
个人觉得还是考虑越界问题。
等待楼主的笔记结果

[解决办法]
还需要考虑dest与src的内存重合问题
[解决办法]
while( *des++ = *src++ );
但是这样写为甚么是低效率的呢

______________________________________
头次听说这样写低效了,期待LZ高效算法.
[解决办法]
是啊,同楼上
[解决办法]
嵌入式?单片机的?
如果是的,是不是还要考虑位数的关系。比如在8位单片机中,就尽量避免把一个int型的变量的值赋给另一个int型的变量中去,这样会造成很多编译后的代码冗余。
[解决办法]
我记得这样的写法是很低效的, 它给的例子是增加了一个
volatile char c;
然后..怎么的我就不记得了

*******************************
我觉得lz如果定义成 voliate的那效率会更加的低的阿

这是一个库函数 在效率上应该是比较高的了。 如果有隐患的话,那就需要看是什么环境了,
个人觉得,一个是null的问题用assert就可以。 再一个就是dest 和src的重合,还有就可能是看操作系统的环境了,对于非法越界,段错误,缺页访问时系统是怎么处理的,这个就相关的很多了



[解决办法]
你把c申明成Register
[解决办法]
while( *des++ = *src++ );这样会很浪费资源吧 而且内存是不是会益处
[解决办法]
mark
等待LZ的答案
[解决办法]
我面试的时候,曾经做过这个原题.

面试官是做手机多媒体开发的.

我写的比较复杂,考虑了很多情况,比如,内存重叠,指针有效等等.

最后,他跟我说一句,你其实没有真正看过strcpy的源码.



其实,真正的就只是while(*p2++ = *p1++),至于其它需要考虑的情况,是需要个人在调用这个函数的时候,在外部考虑的!!!

大家其实不要讨论这些类似问题,多看看源码...
[解决办法]
楼上写的我喜欢

强烈支持
[解决办法]
飘过~
[解决办法]
好象是容易产生不可知的溢出?据说微软的一个漏洞就是这么写的
[解决办法]
while( *des++ = *src++ ); 没什么隐患,这样代码很简洁,也很容易理解.
关键是调用这个之前你要确保几个事情:
1. dest, src都是有效的指针,即非空,且可用.
2. dest所指空间要比src所指空间相等或大,就像你不能用一个1斤的酒瓶去装2斤的水.
3. src所指有效空间中至少有一个\0,否则这个while停不下来了.

满足上面3各条件以后,这个代码就没问题了.
[解决办法]
看着就像容易产生溢出的样子,不过水平太菜,说不上来...
[解决办法]
标记一下


什么人干什么事,不要万千风情集于一身~~~
[解决办法]
高效算法是因为这是一个char一个char的比较
高效的做法好像是算好内存对齐,然后四个四个的COPY过去,vc2003有个strncpy.asm可以看看。但要充分相信编译器。
[解决办法]
关于内存拷贝(不光是字符串),其实有多种写法,当然用C的就一种,但用汇编扩展的很多,我的blog链接上有一个:
http://blog.vckbase.com/bastet/archive/2005/08/26/11518.html
[解决办法]
字符串90%不是4字节对齐。LS的做法反而更慢。
[解决办法]
while( *des++ = *src++ );
低效的原因是,这种写法会比下面的多两次加法运算
while(*des=*src) //当*src==0时,不会运行{}内部的代码,而上面的写法还要再运算一遍。
{
des++;
src++;
}

读书人网 >C语言

热点推荐