奇怪的数组下标越界问题

vccw 2012-04-21 11:10:18
#include <stdio.h>
#define N 4

void main()
{
int a[]={1,2,4,5},i,m=3,j;

for(i=0;i<=N-1;i++)
{
if(m>=a[i]&&m<=a[i+1])
{
for(j=3;j>=i+1;j--)
{
a[j+1]=a[j];
}
break;
}
}

a[i+1]=m;

for(i=0;i<=N-1;i++)
printf("%d",a[i]);

}

当 j=3 时 明显的数组下标越界了 ,不过 奇怪的是这个答案:1254

a[i+1]=m m值已被赋值3,覆盖到a[2]的位置变成5
于是就接下来 使用这个代码测试

#include <stdio.h>
#define N 4

void main()
{
int a[]={1,2,4,5},i,m=3,j;

for(i=0;i<=N-1;i++)
{
if(m>=a[i]&&m<=a[i+1])
{
for(j=3;j>=i+1;j--)
{
a[j+1]=a[j];
}
break;
}
}

a[i+1]=m;

for(i=0;i<=N-1;i++)
printf("%d",a[i]);
printf("\n%d",m);
}

答案是 m为5 明显5被覆盖到了m上的地址了,不过也只是粗略的说明

不知哪位能从编译或地址分配上的机制上说明下为何会被覆盖到m上.
...全文
108 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sundayX 2012-04-22
  • 打赏
  • 举报
回复
这种行为应该是未定义的,取决于编译器或操作系统吧。
1、在freebsd上gcc编译,运行结果还是1245。结果不正确,越界并未覆盖m。gdb调试发现后移循环只执行了一次就跳出了,4并未后移。
2、在win7上用Cygwin环境中gcc编译,运行结果1254。结果不正确,越界覆盖了m。
3、在win7上用vs2010编译,运行结果1234,结果正确。
vccw 2012-04-22
  • 打赏
  • 举报
回复
好吧 既然是和编译器有很大关系 也就不追究了 结贴了!!
vccw 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

这种行为应该是未定义的,取决于编译器或操作系统吧。
1、在freebsd上gcc编译,运行结果还是1245。结果不正确,越界并未覆盖m。gdb调试发现后移循环只执行了一次就跳出了,4并未后移。
2、在win7上用Cygwin环境中gcc编译,运行结果1254。结果不正确,越界覆盖了m。
3、在win7上用vs2010编译,运行结果1234,结果正确。
[/Quote]
确实在 cygwin下编译的 !! vs没有覆盖么 呵呵
dalmeeme 2012-04-21
  • 打赏
  • 举报
回复
改成for(i=0;i<N-1;i++)看看
evencoming 2012-04-21
  • 打赏
  • 举报
回复
if(m>=a[i]&&m<=a[i+1])
i=N-1的时候越界

69,368

社区成员

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

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