Получение ошибки sigabrt в программе heapsort - PullRequest
2 голосов
/ 05 марта 2019

Я получаю ошибку 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;
}

1 Ответ

0 голосов
/ 05 марта 2019

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

heapsort(a, arrsize);

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

int treesize = size;
int i = size;

И затем в этих строках:

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

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

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

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

...