一个数组越界的C++程序
来源:互联网 发布:ubuntu设置搜狗输入法 编辑:程序博客网 时间:2024/06/05 23:01
学生给我发了私信,一个程序运行了好久,在OJ就是提交不了。
题目是:
Description
输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。
Input
10个整数
Output
整理后的十个数,每个数后跟一个空格(注意最后一个数后也有空格)
Sample Input
2 1 3 4 5 6 7 8 10 9
Sample Output
1 2 3 4 5 6 7 8 9 10
HINT
主函数已给定如下,提交时不需要包含下述主函数
/* C/C++代码 */int main(){ const int n=10; int a[n]; input(a,n); handle(a,n); output(a,n); return 0;}
#include<iostream>#include<cstdio>using namespace std;void input(int a[],int);void handle(int a[],int);void output(int a[],int);int main(){ const int n=10; int a[n]; //freopen("input.txt","r",stdin); input(a,n); handle(a,n); output(a,n); return 0;}void input(int a[],int n){ for(int i=0;i<n;i++) cin>>a[i];}void handle(int a[],int n){ int max,i=0,t,min,z,zd,zx; max=a[i]; min=a[i]; for(i=0;i<n;i++) { if(max<a[i]) { max=a[i]; zd=i; //记录最大值的位置 } if(min>a[i]) { min=a[i]; zx=i; //记录最小值的位置 } } t=a[9]; a[9]=max; a[zd]=t; //进行值交换 z=a[0]; a[0]=min; a[zx]=z;}void output(int a[],int n){ for(int i=0;i<n;i++) { cout<<a[i]<<" "; }}这个解答在CodeBlocks中编译通过,屡经测试数据,没有异常,然而,提交后提示“Runtime error”,具体是:
Runtime Error:Segmentation fault
辅助解释:Segmentation fault:段错误,检查是否有数组越界,指针异常,访问到不应该访问的内存区域
这不科学!由“一定是我错了”的思维,转向了“可能是机器错了”,利用管理员帐号,看了测试数据,也没有问题。
再逐句看程序,一个地方引起我的注意,会是25、26行引用a[i],但 i 没有赋值吗?不是,i 的初值是0,于算法没有问题。就在第24行,zd、zx两个变量,也应该是同步赋值的,它们表示最大、最小的数的下标,后面循环中,也及时对这两个数做了更新。
问题逐渐明白了,在24行不给zd、zx赋初值的情况下,如果29和34行的if条件有一个始终未能为真,zd、zx就不会赋值,40行开始的交换,就会出现数组越界。
在这个程序上小修改的办法有了:第24行,加上给zd、zx赋初值,即:int max,i=0,t,min,z,zd=0,zx=0;
这个程序,没有用上单步执行。对这种小几率的问题,单步可能也不管用,思维要严密。
这个程序写得稍显罗嗦,下面给出一个改写版。
#include<iostream>#include<cstdio>using namespace std;void input(int a[],int);void handle(int a[],int);void output(int a[],int);int main(){ const int n=10; int a[n]; //freopen("input.txt","r",stdin); input(a,n); handle(a,n); output(a,n); return 0;}void input(int a[],int n){ for(int i=0;i<n;i++) cin>>a[i];}void handle(int a[],int n){ int i,t,zd=0,zx=0;//默认第0个为最大、最小 for(i=1;i<n;i++) //从第1个开始 { if(a[zd]<a[i]) zd=i; //记录最大值的位置 if(a[zx]>a[i]) zx=i; //记录最小值的位置 } t=a[n-1]; //比用含有“神秘数”的a[9]好 a[n-1]=a[zd]; a[zd]=t; //进行值交换 t=a[0]; a[0]=a[zx]; a[zx]=t;}void output(int a[],int n){ for(int i=0;i<n;i++) { cout<<a[i]<<" "; }}
- 一个数组越界的C++程序
- 关于C语言数组越界的演示程序
- 【C/C++】数组越界
- 数组是否越界的一个类
- 一个由数组越界引发的。。。
- C语言中数组越界的例子
- C# 数组越界的一场处理
- 一个数组越界问题 数组越界
- 一个隐蔽的C内存越界错误
- 数组越界导致程序崩溃
- 一个动态数组越界bug
- 郁闷的数组越界
- 最近遇到的一个数组越界的BUG
- 数组越界写入破坏程序堆栈导致的crash
- 一个很隐蔽的数组下标越界问题
- C++字符数组越界问题的一个案例分析
- C++字符数组越界问题的一个案例分…
- 关于一个数组越界之后的死循环
- Apache Shiro 使用手册(三)Shiro 授权
- C++ static 静态函数,变量详解
- spring学习--集成jdbc
- JS排序
- 如何做到U盘中文件删了之后可以恢复
- 一个数组越界的C++程序
- 让Ubuntu从此告别中文乱码!
- java keytool
- 感知器训练算法----离散单输出
- putty上传文件方法
- C# 右键转到定义转到元数据 -》解决方法
- log4j.properties 使用
- android基于基库的项目设计模式探索
- 程序的重定位