You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Xcode中我的C++程序在main末尾return(0)时触发SIGABRT?

C++程序末尾触发SIGABRT错误的排查与修复

问题描述

在Xcode中运行C++程序时,程序运行过程正常,但每次执行到末尾都会触发SIGABRT错误。已尝试注释函数、调试变量,仍无法定位崩溃原因,代码如下:

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
int output(int, int[]);
void input(int, int[], int&, int&, int&, int&, double&, int );
void display(int, int, int , int , double);

using namespace std;

int main()
{
    int const SIZE = 5000;
    int numArray[SIZE] = {0};
    int lowest, highest;
    int total =0;
    double average = 0;
    int count = 0;
    
    int fileSize = output(SIZE, numArray);
    input(SIZE, numArray, lowest, highest, total, count, average, fileSize);
    
    display(count, lowest, highest, total, average);
      
    return 0;
}

int output(int SIZE, int numArray[])
{
    ofstream outputFile;
    int random;
   
    unsigned seed = time(0);
    srand(seed);
    int const MIN = 4000;
    int const MAX = 5000;

    outputFile.open("numbers.txt");
    
    int fileSize = (rand() % (MAX - MIN + 1) + MIN);
    cout << fileSize << endl;
    
    for (int x = 0; x < fileSize ; x++)
    {
        random = (rand() % (MAX - MIN + 1) + MIN);
        outputFile << random << endl;
        numArray[x] = random;

    }
    
    for (int x = 5000; x >= fileSize ; x--)
    {
        numArray[x] = 0;
    }
    
    outputFile.close();
    
    return (fileSize);
}

void input(int SIZE, int numArray[], int& lowest, int& highest, int& total, int& count, double& average, int fileSize)
{
    string fileName;
    ifstream inputFile;

    cout << "Enter the file name: ";
    getline (cin, fileName);

    inputFile.open(fileName);

    lowest = numArray[0];
    highest = numArray[0];

    for (int i = 0; i < fileSize; i++)
    {
        count = i+1;
        total += numArray[i];
        average = static_cast<double> (total)/fileSize;
        cout << numArray[i] << endl;

        if (numArray[i] < lowest)
            lowest = numArray[i];

        if (numArray[i] > highest)
            highest = numArray[i];
    }
    inputFile.close();
}

void display(int count, int lowest, int highest, int total, double average)
{
    cout << "The total count of numbers in the Array: " << count <<endl;
    cout << "The lowest number in the array: " << lowest << endl;
    cout << "The highest number in the array: " << highest << endl;
    cout << "The total of the numbers in the array: " << total << endl;
    cout << "The average of the numbers in the array: " << average << endl;
    
    return;
}

问题原因分析

崩溃的核心原因是数组越界访问:
在output函数中,numArray数组大小为5000,合法下标范围是0~4999,但后续循环从x=5000开始赋值:

for (int x = 5000; x >= fileSize ; x--)
{
    numArray[x] = 0;
}

当x=5000时,访问numArray[5000]已经超出数组内存边界,会破坏堆内存结构。程序运行过程中可能未立即崩溃,但结束时系统清理资源检测到内存损坏,触发SIGABRT信号。

另外,input函数中打开文件却未读取内容,属于冗余代码,但不会导致崩溃。

修复方案

有两种可行修复方式:

  1. 移除冗余清零循环:main函数初始化数组时已将所有元素设为0,无需在output中再次赋值,直接删除该循环即可。
  2. 修正循环起始下标:将循环起始值改为SIZE-1(即4999),确保访问下标在合法范围内:
for (int x = SIZE - 1; x >= fileSize ; x--)
{
    numArray[x] = 0;
}

建议选择第一种方案,减少不必要的代码执行。

内容的提问来源于stack exchange,提问作者Mason Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:25:37