Получение ошибки sigabrt в программе heapsort

Я получаю ошибку sigabrt, как указано ниже, для данной программы heapsort. Я новичок в программировании, поэтому прошу прощения за глупые ошибки.

ошибка: сигнал прерывания от прерывания (3) (SIGABRT)

Основные части кода следующие

  • heapify — программа для создания кучи из заданного массива

  • heapsort — функция, которая сортирует массив по куче и сохраняет результат в массиве

  • main - функция драйвера


#include <iostream>
#include <math.h>
using namespace std;

void swapper (int first, int second) {

    int temp;
    temp = second;
    second = first;
    first = temp;
}

void heapify (int a[], int size) {

    for(int i = 0; i < (size/2) ; i++) {

        int left = 2*i;
        int right = 2*i + 1;
        if (a[i] < a[left]) {
            swap(a[i], a[left]);
        }
        else if (a[i] < a[right]) { 
            swap(a[i],a[right]);
        }
    }
}

void heapsort(int a[], int size){

    int treesize = size;
    int i = size;
    heapify(a,size);
    while (treesize > 0) {
        cout << " \t " << a[i];
        swap(a[i],a[0]);
        i --;
        treesize--;
        heapify(a, treesize);
    }

    cout <<"\n";

    for(int i = 0; i < size; i++) {
        cout <<"\t"<<a[i];
    }
}

int main() {

    // your code goes here
    int a[] = {10,1,2,11,4,57,12,13,44,14,6,7,9,8,15,16,17,98};
    int arrsize= sizeof(a)/(sizeof(a[0]));
    int pos;
    int ele = 7;
    heapsort(a,arrsize);
    for (int i = 0; i < arrsize; i++){
        cout <<"\n "<<a[i];
        cout<<"\n"<<arrsize;
    }
    return 0;
}

person Chayan Pathak    schedule 05.03.2019    source источник


Ответы (1)


Я не уверен в правильности остальной части программы, но причина, по которой вы получаете исключение, заключается в том, что вы обращаетесь к памяти за пределами границ. Вы вызываете heapsort с таким размером массива:

heapsort(a, arrsize);

И затем вы устанавливаете treesize и i на этот размер:

int treesize = size;
int i = size;

И далее в этих строках:

cout << " \t " << a[i];
swap(a[i], a[0]);

i по-прежнему равно arraysize. Но это может быть максимум arraysize-1. Это вызывает неопределенное поведение при печати a[i] и, что еще хуже, неопределенное поведение в следующей строке, которая изменяет значения за пределами массива. На моей машине первое печатает бессмысленные значения, а второе вызывает повреждение стека. Вместо этого вы должны установить эти значения следующим образом:

int treesize = size-1;
int i = size-1;

Это исправляет печать и исключение.

person Blaze    schedule 05.03.2019