首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >瓦伦警告:我应该认真对待它吗?

瓦伦警告:我应该认真对待它吗?
EN

Stack Overflow用户
提问于 2011-01-28 00:48:07
回答 5查看 7.9K关注 0票数 6

背景:我有一个模仿fgets(character, 2, fp)的小例程,除了它从字符串而不是流中提取一个字符。newBuff被动态分配,字符串作为参数传递,字符声明为char character[2]

例行事务:

代码语言:javascript
复制
character[0] = newBuff[0];

character[1] = '\0';

strcpy(newBuff, newBuff+1);

当读取每个字符时,strcpy复制丢失的信息。

问题:华润确实警告我这个活动,“strcpy(0x419b818,0x419b819)中的源和目标重叠”。

我该担心这个警告吗?

EN

回答 5

Stack Overflow用户

发布于 2011-01-28 00:57:16

是的,而且您还应该担心您的函数的性能在病理上很差(对于应该是O(n^2)的任务来说是O(n))。每次读取字符时,都会用一个字符将字符串的全部内容移回来,这是对时间的极大浪费。相反,您应该保留一个指向当前位置的指针,并增加该指针。

当您发现自己需要memmove或类似的(在重叠的缓冲区之间进行复制)的情况下,几乎总是表示存在设计缺陷。通常,这不仅仅是实现中的一个缺陷,而是接口上的一个缺陷。

票数 5
EN

Stack Overflow用户

发布于 2011-01-28 00:53:18

是的--只有当源和dest不重叠时,strcpy的行为才会被定义。您可以考虑将strlenmemmove组合起来。

票数 4
EN

Stack Overflow用户

发布于 2011-01-28 00:53:18

是的,你应该担心。C标准指出,当源对象和目标对象重叠时,strcpy的行为是未定义。未定义的行为意味着它有时可以工作,或者它可能失败,或者它看起来成功,但在程序的其他地方却明显失败。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4823664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档