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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:28   1715   0

你好

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


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


谢谢您的阅读。

再见。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP