Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;具有相同数组索引的分段错误_C++_Arrays_Segmentation Fault - Fatal编程技术网

C++ C++;具有相同数组索引的分段错误

C++ C++;具有相同数组索引的分段错误,c++,arrays,segmentation-fault,C++,Arrays,Segmentation Fault,我有以下代码: 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; } 我不明白为什么会这样!由于某种原因,在阵列中设置相同的位置会导致segfault。

我有以下代码:

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;
}
我不明白为什么会这样!由于某种原因,在阵列中设置相同的位置会导致segfault。我已经运行了几次程序,它总是产生相同的输出

通过使用调试器逐步查看代码,我可以看到当访问数组时,d(索引)的值是2

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

我的IDE和编译器有问题吗?我正在使用带有EclipseCDT的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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
向量调整;
静态布尔*访问;
成对dfs(int节点){
如果(已访问[节点])
返回make_对(0,节点);
pair best=make_对(0,节点);
for(int-neigh:adj[node]){
pair alt=dfs(节点);
alt.second++;
最佳=最大值(最佳,alt);
}
回报最好;
}
int main(int argc,字符**argv){
整数n,m,def;
cin>>n;
cin>>m;
bool*pho=新bool[n];
memset(pho,0,sizeof(bool)*n);
整数*度=新整数[n];
memset(度数,0,sizeof(int)*n);

cout这些行是错误的:

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

你需要用
a
b
作为键创建
unordered\u-map
实例,然后分别插入
b
a
作为值。如果你需要键值对,你不需要集合向量。

解决这些问题的正确工具是你的调试器。你应该逐行检查你的代码在询问堆栈溢出问题之前。有关更多帮助,请阅读。至少,您应该[编辑]您的问题,以包含一个重现您的问题的示例,以及您在调试器中所做的观察。@πάνταῥεῖ 是的,我已经这样做了!当数组被访问时,我可以看到
d=2
。@AJC:还有其他事情发生。你很可能在程序的其他部分调用了未定义的行为。@KemyLand好的,我将包括整个源文件。但我觉得没有什么问题…@AJC你使用
std::vector
,但你没有使用它。为什么不使用
std::vector degrees(n)
而不是
new[]
?第二,如果
n但这违背了数据结构的目的…我需要能够访问连接到每个“a”的“b”列表.不管怎样,你能解释一下为什么它是错误的吗?当我删除向量的任何用法时,代码似乎是有效的…它是错误的,因为你没有为向量分配内存,然后尝试访问
adj[a],但没有分配内存来存储索引<代码> <代码>。如果你想继续这样,首先将内存分配给你的向量,然后插入元素。@ AjCI认为C++向量自动分配。或者我需要使用插入函数吗?是的,只有当你推,不要尝试访问。先分配内存,然后继续插入顶点。@AJCAlright,谢谢您的时间!我只是对哪些类型需要分配,哪些类型是静态分配的感到困惑
adj[a].insert(b);
adj[b].insert(a);