为何GDB运行C++代码退出码为134,Code::Blocks却正常?
问题原因分析
你的代码存在两处数组越界访问的问题,这是导致程序崩溃(exit code 134对应SIGABRT信号)的核心原因:
vector索引越界(初始化循环)
C++的vector是0起始索引的容器,当你创建vector<long long>a(n);时,容器的有效索引范围是0到n-1。但你的第一个循环写的是:for(int i=1;i<=n;i++){ cin>>a[i]; }当
i=n时,你访问了a[n],这超出了vector的有效内存范围,属于未定义行为——不同环境下表现不同,比如Code::Blocks没触发崩溃,但在线环境直接报错。循环中的越界访问(计算逻辑)
第二个循环的条件是i<=n,步长为2:for(long long i=1;i<=n;i=i+2){ s+=a[i]-a[i+1]; }当
i等于n时,代码会访问a[i+1]也就是a[n+1],这完全超出了vector的内存范围,直接触发内存错误,导致程序被系统终止,因此没有任何输出。
另外还有一个潜在问题:变量s没有初始化,它的初始值是随机的,即使程序不崩溃,计算结果也会不正确。
修复后的代码示例
#include <iostream> #include <vector> using namespace std; int main(){ long long n; cin>>n; vector<long long>a(n); // 从0开始遍历vector for(int i=0;i<n;i++){ cin>>a[i]; } long long s = 0; // 初始化s // 调整循环逻辑避免越界,按成对元素处理 for(long long i=0;i < n-1;i=i+2){ s+=a[i]-a[i+1]; } cout<<s; return 0; }
内容的提问来源于stack exchange,提问作者Oak
相关产品推荐
相关产品推荐

