C++ 关于分段故障的有趣观察

C++ 关于分段故障的有趣观察,c++,algorithm,graph,segmentation-fault,C++,Algorithm,Graph,Segmentation Fault,下面是我的代码 #include <iostream> #include <queue> using namespace std; bool comp (pair<int, int> a, pair<int, int> b) { if (a.second==b.second) return a.first<b.first; return a.second<b.second; } int main () { int

下面是我的代码

#include <iostream>
#include <queue>
using namespace std;
bool comp (pair<int, int> a, pair<int, int> b) {
    if (a.second==b.second) return a.first<b.first;
    return a.second<b.second;
}
int main () {
    int n, m;
    bool visited[n+1];
    cin>>n>>m;
    int mat[n+1][n+1];
    vector<pair<int, int> > v;
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=n; j++) {
            cin>>mat[i][j];
        }
    }
    queue<pair<int, int> > q;
    q.push(make_pair(m, 0));
    visited[m]=1;
    //for (int i=1; i<=n; i++) { for (int j=1; j<=n; j++) { if (mat[i][j]!=0&&mat[i][j]!=1 )cout<<mat[i][j]<<" ";} cout<<endl;}
    while (!q.empty()) {
        pair <int, int> curr=q.front();
        v.push_back(curr);
        q.pop();
        for (int i=1; i<=n; i++) {
            if (mat[curr.first][i]&&!visited[i]&&curr.first!=i) {
                q.push(make_pair(i, curr.second+1));
                visited[i]=1;
            }
        }
    }
    sort(v.begin(), v.end(), comp);
    int cdist=0;
    for (pair<int, int> i: v) {
        if (cdist!=i.second) cout<<endl;
        cdist=i.second;
        cout<<i.first<<" ";
    }
    return 0;
}
#包括
#包括
使用名称空间std;
bool comp(a对、b对){
如果(a.second==b.second)返回a.firstn>>m;
int mat[n+1][n+1];
向量v;
对于(int i=1;imat[i][j];
}
}
队列q;
q、 推送(使配对(m,0));
访问量[m]=1;

//对于(int i=1;这是可爱的未定义行为(因为您从未初始化
n
)在我的PC上,两个版本都会产生SeaStFultMead行为,所以字面上任何事情都可能发生,包括看似正确的行为。未定义的行为可能是段错误,它可以正常工作,或者导致鼻腔恶魔。C++不允许你声明可变长度数组,所以你也依赖于GCC扩展。@ BobWang它是正确的,但我会说它“恰好是我所期望的。”可爱的未定义行为(因为您从未初始化
n
)在我的PC上,两个版本都会产生SeaStFultMead行为,所以字面上任何事情都可能发生,包括看似正确的行为。未定义的行为可能是段错误,它可以正常工作,或者导致鼻腔恶魔。C++不允许你声明可变长度数组,所以你也依赖于GCC扩展。@ BobWang没错,但我会用“我所期望的巧合”来形容