C++查找n个数字最大值时出现运行错误的解决方法
运行错误的根因定位与修复
首先明确:你把报错原因误判为时间超限是完全不对的。你写的求最大值逻辑是单次线性遍历,时间复杂度为O(n),哪怕处理十万级别的输入规模也根本不会触发超时限制。现在程序刚启动就因为非法内存访问直接崩溃,评测机拿不到正常输出,才会报运行错误。
逐处排查的错误
- 无效头文件依赖
代码里引入的curses.h是用于终端文本UI开发的第三方库,几乎所有在线评测平台都不会预装这个库,这行代码会直接导致编译失败,和求最大值的功能没有任何关系,直接删除即可。 - 内存申请逻辑错误(核心崩溃原因)
new int(n)和new int[n]是完全不同的语法:前者是申请单个int变量,用n的值初始化这个变量,仅占用4字节内存;后者才是申请长度为n的int数组。你当前的代码只申请了1个int的空间,后续循环要连续读写n个int的位置,远远超出了申请的内存边界,操作系统会直接判定程序非法访问内存,强制终止运行。 - 数组下标越界
C++数组下标从0开始计数,你写的循环从i=1开始存储输入值,既没有正确给数组第一个元素赋值,当i走到n的位置时,还会访问数组最后一个元素后面的相邻内存,进一步触发崩溃。正确的循环范围应该是从i=0到i < n,覆盖数组全部有效下标。 - 内存泄漏风险
用new申请的数组没有对应的delete[]释放,虽然在线评测环境会在程序退出时自动回收所有内存,但这是不规范的写法,很容易在长期运行的程序里造成内存泄漏。
修正后的可正常提交代码
#include<iostream> using namespace std; int main() { int n; cin >> n; // 正确申请长度为n的int数组 int *p = new int[n]; // 从下标0开始遍历存储输入,避免越界 for(int i = 0; i < n; i++){ cin >> p[i]; } int largest = p[0]; // 从第二个元素开始遍历比对最大值 for(int i = 1; i < n; i++){ if(largest < p[i]) largest = p[i]; } cout << largest; // 匹配释放申请的数组内存 delete[] p; return 0; }
新手更推荐用标准库的
vector存储输入数据,不需要手动申请释放内存,从根源上避免内存越界、泄漏的问题。实现思路和现在的逻辑完全一致,代码会更简洁。
内容的提问来源于stack exchange,提问作者James。
相关产品推荐
相关产品推荐

