HackerRank提交C++代码报ABORT CALLED错误,本地IDE运行正常求助
问题原因分析
这个问题完全由动态内存分配的语法错误导致,核心问题如下:
- 你用来分配数组的语法写错了:
int *ptr = new int(n);中的圆括号代表你只申请了1个int类型的堆内存,且将该内存的值初始化为n,根本没有申请可容纳n个int的数组空间。正确的数组分配语法应该是用方括号:int *ptr = new int[n]; - 后续你循环向
ptr[i]写入数据的时候,从i=1开始就已经发生了堆内存越界,属于C++标准中的未定义行为:- 本地IDE运行环境的内存保护规则较松、或者测试时n的取值很小,越界访问的是未被占用的空闲内存,就不会立刻触发崩溃,看起来运行正常
- HackerRank的评测环境内存校验机制更严格,或者测试用例的n取值更大,越界写入会触及受保护的内存区域,就会触发
ABORT CALLED报错
修复方案
将动态内存分配行改为数组分配语法,同时补充数组内存释放的逻辑(虽然进程退出后系统会自动回收,但符合C++编码规范的写法需要主动释放):
#include <iostream> using namespace std; int main(){ int n {0}; cin >> n; // 修正:用方括号分配n个int的数组 int *ptr = new int[n]; for(int i =0; i <n ; i++) cin >> ptr[i]; int begin =0, end = n-1; while(begin < end){ swap(ptr[begin], ptr[end]); begin++; end--; } for(int i =0; i < n; i++) cout << ptr[i] << " "; // 补充:释放数组内存 delete[] ptr; return 0; }
内容的提问来源于stack exchange,提问作者Aditya Prakash
相关产品推荐
相关产品推荐

