Thread 1: EXC_BAD_ACCESS (code=1, adress=0x0)

Thread 1: EXC_BAD_ACCESS (code=1, adress=0x0)

本文关键字:adress 0x0 code ACCESS EXC BAD Thread      更新时间:2023-10-16

我正在用c++ (XCode)制作Dijikstra算法。我得到exc_bad_access code=1在那一刻:

 for (k=0; k<M; k++){
    input>>i>>j>>V;
    Graf[i][j] = V;
}
整个代码:

#include <iostream>
#include <fstream>

int min(int[]);                             
int **Graf;                                 
int *Label;                                 
int *Active;                                
int i, j, k;
int Start, N, M, V, Last;
using namespace std;
int min(int array[]) {
    int min, k, min_pos = -1;
    min = 32767;

    for (k=0; k<M; k++) {
        if (array[k] < min && Active[k] == 1){
            min = array[k];
            min_pos = k;
            }
        }
    return min_pos;
}


int main(){
    ifstream input ("input.txt");           

    input>>N>>M>>Start>>Last;
     if (!input){
        cout << "File not found" << endl;
        return 1;
    }

    Graf = new int *[N];
    for (i=0; i<N; i++){
        Graf[i] = new int [N];
    }

    for (i=0; i<N; i++){
        for (j=0; j<N; j++){
            Graf[i][j]=0;
        }
    }
    Label = new int [N];

    Active = new int [N];

    for (i=0; i<N; i++){
        Label[i] = 0;
        Active[i] = 0;
    }

    for (k=0; k<M; k++){
        input>>i>>j>>V;
        Graf[i][j] = V;
    }

    for (i=0; i<M; i++){
        Label[i] = 32767;
        Active[Start] = 1;
    }
    Label[Start] = 0;
    i = Start;
    do
    {
        for (j=0; j<N; j++)
            if (Graf[i][j] != 0 && Label[j] > Label[i] + Graf[i][j]){
                Active[j] = 1;
                Label[j] = Label[i] + Graf[i][j];
            }
            Active[i] = 0;
            i=min(Label);
    }
    while (i != -1);
    cout << Label[Last] << endl;
    return 0;
}

我找了好几天错了,可是找不到。

Input.txt5 9 0 40 0 5 2 4 00 0 0 7 0 65 0 0 9 1 152 7 9 0 0 124 0 1 0 0 80 6 15 12 8 0

我相信你的错误是在你的输入文件中:你读取I和j并使用它来访问你的数组,而没有验证这些值是否在预期的范围内。

例如,如果您用错误消息改进您的问题代码,如:

for (k=0; k<M; k++){
    input>>i>>j>>V;
    if (i>=N || j>=N) {
        cerr << "Bad Input for k="<<k<<": "<<i<<","<<j<<","<<V<<endl;
        continue;
    }
    //assert(i<N && j<N);  variant if you don't care for the values
    Graf[i][j] = V;
}

您将得到以下结果:

Bad Input for k=3: 7,0,6
Bad Input for k=4: 5,0,0
Bad Input for k=5: 9,1,15
Bad Input for k=6: 2,7,9