簡體   English   中英

Mac HighSierra上C ++中的分段錯誤11

[英]Segmentation fault 11 in C++ on Mac HighSierra

當我嘗試將隊列程序中的數據放入隊列時,它將出現分段錯誤11。 我在Atom文本編輯器中使用GCC編譯器。

#include<iostream>
#include<stdlib.h>
#define MAX 5

using namespace std;

struct queue{
    int data[MAX];
    int awal, akhir;
}antrean;

void first(){
    antrean.awal = -1;
    antrean.akhir = -1;
}

bool isfull(){
    if(antrean.akhir == MAX-1){
        return true;
    }else{
        return false;
    }
}

bool isempty(){
    if(antrean.akhir == -1){
        return true;
    }else{
        return false;
    }
}

void tampildata(){
    if(!isempty()){
        for(int i=antrean.awal; i<antrean.akhir; i++){
            cout<<antrean.data[i]<<" | ";
        }
    }

    cout<<endl;
}

void inqueue(){
    int elemen;

    if(isempty()){
        cout<<"input data : ";
        cin>>elemen;
        antrean.data[antrean.akhir] = elemen;
        antrean.akhir++;
        cout<<"data berhasil ditambah"<<endl;
        tampildata();
    }else{
        cout<<"Queue penuh";
    }
}


void dequeue(){
    tampildata();

    if(!isempty()){
        cout<<"mengambil data "<<antrean.data[antrean.awal]<<endl;

        for(int i=antrean.awal; i<antrean.akhir; i++){
            antrean.data[i]=antrean.data[i+1];
        }

        antrean.akhir--;
    }else{
        cout<<"antrean empty";
    }
}

void cari(){
    if(!isempty() == 1){
        int cari;
        bool state = false;
        cout << "Data yang dicari :";
        cin >> cari;

        for(int i = antrean.awal; i<antrean.akhir; i++){
            if (antrean.data[i] == cari) {
                cout << "Data ditemukan pada indeks Ke-:" << antrean.data[i]+1<< endl;
                state = true;
                break;
            }
        }
    } else{
        cout << "Data tidak ditemukan";
    }
}

void totalarray(){
    int temp = 0;

    for(int i=-1; i<antrean.akhir; i++){
        temp = temp+antrean.data[i];
    }

    cout << "Total nilainya :" << temp;
}

int main(){
    int pilihan, elemen;
    first();

    do{
        tampildata();
        cout<<"1. Init"<<endl<<"2. inQueue"<<endl<<"3. deQueue"<<endl<<"4. tampil data"<<endl<<"5. Cari data"<<endl << "6. Total nilai"<<endl<<"7. Rata-rata Array"<<endl;
        cout<<"8. Nilai terbesar"<<endl<<"9. Nilai terkecil"<<endl<<"10. Clear"<<endl<<"11. Keluar";
        cout<<"input pilihan :";
        cin>>pilihan;

        switch(pilihan){
            case 1:
                first();
                break;
            case 2:
                inqueue();
                break;
            case 3:
                dequeue();
                break;
            case 4:
                tampildata();
                break;
            case 5:
                cari();
                break;
            case 6:
                totalarray();
                break;
            case 7:
                exit(0);
        }
    }

    while(pilihan!=7);
        return 0;
}

您的問題在於櫃台的價值。 您最初將其設置為-1(盡管0元素為0可能更有意義?)。 然后,當您第一次添加到隊列時,您基本上想將元素添加到第(-1)位。 這將導致您在數組的邊界之外進行寫入,並且發生分段錯誤。

antrean.akhir = -1;
...
antrean.data[antrean.akhir] = elemen;

您可以簡單地將計數器設置為0,並使其實際計算數組中元素的數量。

我還沒有完成其余的代碼,所以不能說以后不會因為其他原因而崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM