由于数组赋值超过定义的范围造成的错误
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语句:
第一行a[0].x1与a[0].x2的值与我认为的输出值不服,我认为应该输出a[0].x1=1 a[0].x2=4。
为了找到问题,我又添加了几行printf语句:
以上运行结果中的下图处:
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的现象了。
我觉得可能是:由于数组赋值超过定义的范围造成的错误。
谢谢您的阅读。
再见。
这是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的现象了。
我觉得可能是:由于数组赋值超过定义的范围造成的错误。
谢谢您的阅读。
再见。
相关文章推荐
- ubuntu 14.04 mysql 主从配置
- C语言小编程之判断一个数是否是2的n次方的巧妙方法
- 设计模式之工厂方法模式及代码示例
- 类的构造函数
- angular 关于 factory、service、provider的相关用法
- DrawerLayout + Toolbar
- Hibernate中get方法和load方法的区别
- SQL Server 获取数据库表的元信息
- Java中String类的isEmpty()方法
- poj--1789 Truck History(最小生成树Prim算法)
- 北化oj 2374- A+B结果的个位数
- LeetCode 59 Spiral Matrix II
- 大数乘法(二)
- Linux下物理内存和虚拟内存交换机制
- 在写一个iOS应用之前必须做的7件事(附相关资源)
- STL map
- 最近读到的好博文分享一下
- (2016春) 作业4:结对编程—词频统计
- 面向对象编程(五)多态--对象上下转型,动态绑定和静态绑定,应用
- usb设备驱动描述,王明学learn