您的位置:首页 > 其它

由于数组赋值超过定义的范围造成的错误

2016-03-17 22:30 316 查看
你好

这是ccf中的一道试题:





我使用c语言按照样例输入做了尝试:

#include <stdio.h>
struct hello
{
int x1;
int y1;
int x2;
int y2;
};
main()
{
int NUM=2;
struct hello a[NUM];

a[0].x1=1;
a[0].y1=1;
a[0].x2=4;
a[0].y2=4;

a[1].x1=2;
a[1].y1=3;
a[1].x2=6;
a[1].y2=5;
//printf("1 a[0].x1=%d a[0].x2=%d\n",a[0].x1,a[0].x2);

int max_x=0;
int max_y=0;

//printf("2 a[0].x1=%d a[0].x2=%d\n",a[0].x1,a[0].x2);
int i;
for(i=0;i<NUM;i++)
{
if(a[i].x2>max_x)
{
max_x=a[i].x2;
}
if(a[i].y2>max_y)
{
max_y=a[i].y2;
}
}
//printf("max_x=%d max_y=%d\n",max_x,max_y);

//printf("3 a[0].x1=%d a[0].x2=%d\n",a[0].x1,a[0].x2);
int b[max_x][max_y];
int j;
int k;
//printf("4 a[0].x1=%d a[0].x2=%d\n",a[0].x1,a[0].x2);
//printf("\n");
//printf("\n");
for(j=0;j<=max_x;j++)
{
for(k=0;k<=max_y;k++)
{
b[j][k]=0;
//printf("%d %d a[0].x1=%d a[0].x2=%d\n",j,k,a[0].x1,a[0].x2);
}
}

//printf("5 a[0].x1=%d a[0].x2=%d\n",a[0].x1,a[0].x2);
for(i=0;i<NUM;i++)
{
//printf("i=%d\n",i);
//printf("6 a[%d].x1=%d a[%d].x2=%d\n",i,a[i].x1,i,a[i].x2);
for(j=a[i].x1;j<=a[i].x2;j++)
{
for(k=a[i].y1;k<=a[i].y2;k++)
{
b[j][k]=1;
//b[j][k]=99;
// printf("b[%d][%d]=%d\n",j,k,b[j][k]);
}
}
}
//printf("\n");

for(j=0;j<=max_x;j++)
{
for(k=0;k<=max_y;k++)
{
printf("b[%d][%d]=%d\n",j,k,b[j][k]);
}
}
}

二维数组b为1代表被涂上颜色。运行时结果不对:



b[0][0]不应该等于1。

我在上面代码的注释位置加了一条printf语句:

printf("6  a[%d].x1=%d a[%d].x2=%d\n",i,a[i].x1,i,a[i].x2);
运行,结果为:



第一行a[0].x1与a[0].x2的值与我认为的输出值不服,我认为应该输出a[0].x1=1 a[0].x2=4。

为了找到问题,我又添加了几行printf语句:

#include <stdio.h>
struct hello
{
int x1;
int y1;
int x2;
int y2;
};
main()
{
int NUM=2;
struct hello a[NUM];

a[0].x1=1;
a[0].y1=1;
a[0].x2=4;
a[0].y2=4;

a[1].x1=2;
a[1].y1=3;
a[1].x2=6;
a[1].y2=5;
printf("1  a[0].x1=%d a[0].x2=%d\n",a[0].x1,a[0].x2);

int max_x=0;
int max_y=0;

printf("2  a[0].x1=%d a[0].x2=%d\n",a[0].x1,a[0].x2);
int i;
for(i=0;i<NUM;i++)
{
if(a[i].x2>max_x)
{
max_x=a[i].x2;
}
if(a[i].y2>max_y)
{
max_y=a[i].y2;
}
}
printf("max_x=%d max_y=%d\n",max_x,max_y);

printf("3  a[0].x1=%d a[0].x2=%d\n",a[0].x1,a[0].x2);
int b[max_x][max_y];
int j;
int k;
printf("4  a[0].x1=%d a[0].x2=%d\n",a[0].x1,a[0].x2);
printf("\n");
printf("\n");
for(j=0;j<=max_x;j++)
{
for(k=0;k<=max_y;k++)
{
b[j][k]=0;
printf("%d  %d  a[0].x1=%d a[0].x2=%d\n",j,k,a[0].x1,a[0].x2);
}
}

printf("5  a[0].x1=%d a[0].x2=%d\n",a[0].x1,a[0].x2);
for(i=0;i<NUM;i++)
{
printf("i=%d\n",i);
printf("6  a[%d].x1=%d a[%d].x2=%d\n",i,a[i].x1,i,a[i].x2);
for(j=a[i].x1;j<=a[i].x2;j++)
{
for(k=a[i].y1;k<=a[i].y2;k++)
{
b[j][k]=1;
//b[j][k]=99;
printf("b[%d][%d]=%d\n",j,k,b[j][k]);
}
}
}
printf("\n");

for(j=0;j<=max_x;j++)
{
for(k=0;k<=max_y;k++)
{
printf("b[%d][%d]=%d\n",j,k,b[j][k]);
}
}
}
运行结果如下:





以上运行结果中的下图处:



a[0].x1和a[0].x2为什么会由1和4变为0和0哪?

如果是覆盖又是怎么发生的哪?

经过思考我发现在定义二维数组b时有错误。将源代码中的

int b[max_x][max_y];

改为

int b[max_x+1][max_y+1];

再运行就没有a[0].x1和a[0].x2变为0的现象了。



我觉得可能是:由于数组赋值超过定义的范围造成的错误。

谢谢您的阅读。

再见。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: