关于memcpy不考虑内存重叠的问题

One-_-Piece 2013-10-02 09:41:14
VS2010,代码如下,问题见注释

	char str[] = "abcde";
printf( "%s\n", memcpy( str + 1, str, 4 ) ); //正常输出abcd,考虑内存重叠,不应该是输出aaaa吗?
...全文
234 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigwangdi 2013-10-04
  • 打赏
  • 举报
回复
memmove会处理重叠的情况,memcpy不会。memcpy主要是性能上的考虑,memmove主要是安全性上的考虑。
一根烂笔头 2013-10-03
  • 打赏
  • 举报
回复
单步跑,看看过程
lin5161678 2013-10-03
  • 打赏
  • 举报
回复
不保证有正确结果 为什么都理解为 保证有不正确的结果 语文问题??
xusir98 2013-10-03
  • 打赏
  • 举报
回复
学习一下
AnYidan 2013-10-03
  • 打赏
  • 举报
回复
lz 自己设个断点,看看str 的变化
lm_whales 2013-10-03
  • 打赏
  • 举报
回复
char str[200] = "abcdefghijklmnopq"; printf( "%s\n", memcpy( str+4 , str+8, 6 ) ); 看看是什么效果
worldy 2013-10-02
  • 打赏
  • 举报
回复
C库就有说明,如果内存有重叠,函数会考虑拷贝方向,使得重叠处的字节能正确拷贝
  • 打赏
  • 举报
回复
编译器会优化吧
qq120848369 2013-10-02
  • 打赏
  • 举报
回复
必须memmove。
mLee79 2013-10-02
  • 打赏
  • 举报
回复
我这几个编译器, 输出 abcd , aaaa 的都有, 还有输出 abcc 的...
飞天御剑流 2013-10-02
  • 打赏
  • 举报
回复
对于memcpy来说,overlap属于未定义行为,就是说,编译器的设计者可以不考虑overlap情况,但并非必须不考虑overlap,懂了没?
mLee79 2013-10-02
  • 打赏
  • 举报
回复
内存重叠的memcpy是未定义行为, 输出 aaaa , abcd 的都有, 常见的 M$ CRT, 高点版本的 glibc/eglibc 的运行库下, memcpy行为都跟 memmove 一样...

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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