memcpy不同类型数组exceed warning

allenbein 2012-08-28 09:25:17
unsigned short array_short[15];
unsigned char array_char[30];

array_short数组的每个元素赋值,然后

memcpy(array_char,array_short,30);

系统会给出:
Apparent access beyond array for function 'memcpy(void *, const void *, unsigned int)', argument 3 exceeds argument 2
的告警,请问如何消除这个告警?
...全文
355 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
小默 2012-08-28
  • 打赏
  • 举报
回复
它说明是你的访问超出了数组,你把数组容量调大试试看,试探一下它检查的规则
allenbein 2012-08-28
  • 打赏
  • 举报
回复
唉。。。我们是没有办法关的。。。编译代码都不是在本地做的。所以比较困难一些,这些warning level也都是公司定的,个人是没有权利修改的。
小默 2012-08-28
  • 打赏
  • 举报
回复
其实有些时候是不得不关警告的,比如在VC下写程序,只要用到strcopy或者sprintf之类的函数就会出现4996警告,我一向都是将其关闭的,因为很多时候警告是很有用的,可能指示着一个错误,但无用的警告太多了的话会让人眼花,看都懒得看了,就会埋下错误隐患,所以如果确认是无意义的警告最好就关掉。
allenbein 2012-08-28
  • 打赏
  • 举报
回复
感谢9楼,不过这两种方法我之前试过了 还是不行,比较晕的底层问题,呵呵。我的编译器可能是美国那边的,不知道具体是什么编译器,也许不是gcc或者其他熟悉的编译器,比较郁闷。vs开4级warning level编也没exceed warning吗?
yht8708 2012-08-28
  • 打赏
  • 举报
回复
vs2010 没有……
小默 2012-08-28
  • 打赏
  • 举报
回复
VS2005下试验,完全没有任何警告和错误。
要不你换成这样试试?
memcpy(&array_char[0],&array_short[0],30);
或者
memcpy((void*)&array_char[0],(void*)&array_short[0],30);
再不行就扩大数组,或者直接屏蔽警告吧。
allenbein 2012-08-28
  • 打赏
  • 举报
回复
请大家不用通过关闭、屏蔽等方法绕开问题,如果遇到告警就关闭相应开关或者宏,那软件质量何在?
Gloveing 2012-08-28
  • 打赏
  • 举报
回复
查看提示错误/警告代码的编号,比如是4244,那么在文件开始时加一句
#pragma warning(disable : 4244)
allenbein 2012-08-28
  • 打赏
  • 举报
回复
gcc或者vc的编译器应该都会出现这个warning。
退学者的游戏 2012-08-28
  • 打赏
  • 举报
回复
楼主也没有正面给出你所使用的编译器是哪款啊。
allenbein 2012-08-28
  • 打赏
  • 举报
回复
楼上没有正面解决问题啊。如果能关 我就不上来发帖了。这个问题的主旨是解决不同类型数组之间memcpy。
pathuang68 2012-08-28
  • 打赏
  • 举报
回复
关闭编译器的警告选项开关。
allenbein 2012-08-28
  • 打赏
  • 举报
回复
我顶!

70,022

社区成员

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

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