|
你好
这是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的现象了。

我觉得可能是:由于数组赋值超过定义的范围造成的错误。
谢谢您的阅读。
再见。 |