C++-二维数组越界

C++-二维数组越界

灵芸 发布于 2017-09-13 字数 224 浏览 1404 回复 4

在CSDN看到的一个帖子,楼主也想不到答案,题目如下:

下列程序是建立一个按以下格式输出的二维数组:

1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 1 0 1 0
1 0 0 0 1

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

归属感 2017-10-27 4 楼

#include <stdio.h>
main()
{
int a[5][5],i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)//循环停止条件是j=5
a[i][j]= ____(i==j)_______;
for(i=0;i<5;i++)
{
a[i][j]=1; //这里越界,是因为上面的for循环停止条件是j=5,在这里进入循环的第一次是 a[0][5]=1,而数组的下标是从0到4。但是,由于数组是连续开辟空间的,对a[0][5]赋值,实际上是对a[1][0]赋值。所以,编译、链接和执行都不会报错,只是结果不对而已。这里应该改成
a[i][j-1]就能够获得正确的结果。
_____j--______;
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
printf("%3d",a[i][j]);
printf("n");
}
}
本程序运行的错误结果为:
1 0 0 0 0
1 1 0 0 1
0 0 1 1 0
0 0 1 1 0
0 1 0 0 1

甜柠檬 2017-10-16 3 楼

可以去掉第二个空格的for然后在第一个填写(i==j||j==4-i)?1:0;
去掉for(i=0;i<5;i++)
{
a[i][j]=1; //a[4][5]的时候好像已经数组越界了?
___________;
}

完全没意义 写这道题的哥们 肯定不懂数组 什么时候能出现a[4][5] 根本不会出现

这句本来就是累赘 不晓得是干嘛 扯淡的吧

一句能解决的问题 为何写两句 这段代码 存在很大的弊端 在有限的循环完成更多的任务

以效率为目的 我不是以做题为目的 我写代码 不扯淡

泛泛之交 2017-09-29 2 楼
#include <stdio.h>
int main()
{
    int a[5][5],i,j;
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            a[i][j]= (i==j);
    //here i = 5; j = 5
//原来的代码没有j=4,则直接用到a[0][5],超出数组使用边界了,结果是可以输出的,只是不是要求格式
//在for起始条件里加上j=4
    for(i=0,j=4;i<5;i++)
    {
        a[i][j]=1; 
        j--;
    }
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
            printf("%3d",a[i][j]);
        printf("n");
    }
    return 0;
}

改了下,没什么大问题,就是数组使用的时候超出使用的边界了,改一下就OK!VS2010试了下,正常输出!

瑾兮 2017-09-23 1 楼

#include <stdio.h>
main()
{
int a[5][5],i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
a[i][j]=(i==j);

j=4;
for(i=0;i<5;i++)
{ a[i][j]=1;
if(j>0)
j--;
else if(j<0)
printf("数组越界");
}
for(i=0;i<5;i++)
{for(j=0;j<5;j++)
printf("%3d",a[i][j]);
printf("n");

}
}
这是我写的,至于你上面的越界是因为 没有初始化变量j。