具有相同数组索引的C 分割故障



我有以下代码:

bool *pho=new bool[n];
memset(pho, 0, sizeof(bool) * n);
for (int i = 0; i < m; i++) {
    int d=2;
    cout << "i=" << i << ", d="<<d<< endl;
    pho[d] = true;
}

使用输入n=8运行会导致以下输出:

i=0, d=2
i=1, d=2
[Segfault]

我不明白为什么会发生这种情况!由于某种原因,在数组中设置相同的位置会导致segfault。我已经运行了几次程序,并且总是会产生相同的输出。

使用调试器逐步浏览代码,我可以看到D(索引)的值是2时2.

我尝试使用全局数组和静态全局数组,这两者都会导致相同的错误。

我的IDE和编译器有问题吗?我正在使用Eclipse CDT使用mingw,并启用了STD/C 11选项。

这是整个源文件,如果程序的其他任何部分都引起问题:

#include <iostream>
#include <queue>
#include <vector>
#include <unordered_set>
#include <utility>
#include <algorithm>
#include <cstring>
using namespace std;
vector<unordered_set<int>> adj;
static bool *visited;
pair<int, int> dfs(int node) {
    if (visited[node])
        return make_pair(0, node);
    pair<int, int> best = make_pair(0, node);
    for (int neigh : adj[node]) {
        pair<int, int> alt = dfs(node);
        alt.second++;
        best = max(best, alt);
    }
    return best;
}
int main(int argc, char** argv) {
    int n, m, def;
    cin >> n ;
    cin >> m;
    bool *pho=new bool[n];
    memset(pho, 0, sizeof(bool) * n);

    int *degrees=new int[n];
    memset(degrees, 0, sizeof(int) * n);
    cout << "n="<<n<<", m="<<m<<endl;
    for (int i = 0; i < m; i++) {
        int d=2;
        cout << "i=" << i << ", d="<<d<< endl;
        pho[d] = true;
    }

    for (int i = 0; i < n - 1; i++) {
        int a, b;
        cin >> a >> b;
        adj[a].insert(b);
        adj[b].insert(a);
        degrees[a]++;
        degrees[b]++;
    }
    queue<int> next;
    for (int i = 0; i < n; i++) {
        if (degrees[i] == 0) {
            next.push(i);
        }
    }
    while (!next.empty()) {
        int node = next.front();
        next.pop();
        if (pho[node])
            continue;
        for (int neigh : adj[node]) {
            adj[node].erase(neigh);
            adj[neigh].erase(node);
            degrees[node]--;
            degrees[neigh]--;
            if (degrees[neigh] == 1)
                next.push(neigh);
        }
    }
    visited=new bool[n];
    memset(visited, 0, sizeof(bool) * n);
    pair<int, int> pivot = dfs(def);
    memset(visited, 0, sizeof(bool) * n);
    pair<int, int> end = dfs(pivot.second);
    int dist = end.first; //number of edges she only has to walk once
    int tree = n - 1; //number of edges in tree
    int otherdist = tree - dist; //number of edges she has to walk twice
    int total = dist + otherdist * 2;
    cout << total << endl;
    return 0;
}

这些行是错误的:

adj[a].insert(b);
adj[b].insert(a);

您需要用ab作为密钥创建unordered_map实例,然后分别将ba插入值。如果您需要键值对,则不需要设置。

相关内容

  • 没有找到相关文章

最新更新