C++程序在main之前崩溃

c++ program crashes before main

本文关键字:崩溃 main 程序 C++      更新时间:2023-10-16

当我运行下面的代码时,程序崩溃,编译器消息是分段错误。我已经在我的代码中搜索了错误,但找不到任何错误。我的程序似乎甚至没有进入main(),因为我尝试使用"cout"来查看它崩溃的位置,但我没有得到输出,即使在 main 启动后"cout"立即出现。这是代码。有人可以告诉我问题是什么吗?

#include <cmath>
#include <stdio.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct edge_t
{
    int a,b,w;
};
bool comp(edge_t a, edge_t b)
{
    if(a.w < b.w)
        return true;
    return false;
}
vector<int> parent;
int find_parent(int x)
{
    if(parent[x] == x)
        return x;
    parent[x] = find_parent(parent[x]);
    return parent[x];
}
void join(int a,int b)
{
    parent[find_parent(a)] = find_parent(b);
    return;
}
int mst(vector<edge_t> v)
{
    sort(v.begin() , v.end() , comp);
    for(int i=0;i<v.size();++i)
        parent[i] = i;
    int sum = 0;
    for(int i=0;i<v.size();++i)
    {
        if(find_parent(v[i].a) != find_parent(v[i].b))
        {
            join(v[i].a, v[i].b);
            sum += v[i].w;
        }
    }
    return sum;
}
int main() {
    cout<<"Hello?n"; ///does not display anything QQ
    int n,m;
    scanf("%d %d",&n,&m);
    parent.resize(n);
    int p,q,r;
    vector<edge_t> edges;
    int s =0;
    for(int i=0;i<m;++i)
    {
        scanf("%d %d %d",&p,&q,&r);
        edge_t tmp;
        tmp.a = p;
        tmp.b = q;
        tmp.w = r;
        s+=r;
        edges.push_back(tmp);
    }
    printf("%dn", s - mst(edges));

    return 0;
}

我正在 hackerrank.com 上使用在线 IDE(我在那里练习问题)。

mst函数内部

for (int i = 0; i<v.size(); ++i)
    parent[i] = i;

这假设parent具有相同或多个v的元素,如果不是这种情况,您的程序将崩溃。

在同一个函数中,你调用find_parent并且你没有验证ab低于parent.size(),如果你在find_parent函数中检查它,那就好了,但你也没有在那里检查它。

if (find_parent(v[i].a) != find_parent(v[i].b))
{
    join(v[i].a, v[i].b);
    sum += v[i].w;
}

因此,如果find_parent获得无效输入,您的程序将崩溃

int find_parent(int x)
{
    if (parent[x] == x)
        return x;
}

根据您的编译环境,如果您启用了系统不支持的指令集(例如 AVX),则崩溃可能会在 main 之前发生(我已经看到这种情况发生在带有 VC++ 的 Windows 上)。尝试在关闭所有优化的情况下进行编译,以获得"古老"的目标架构。

根据您的平台,这也可能是由于找不到共享库,尽管这似乎不太可能。

编辑:删除了关于cout的部分,因为你有一个结束行字符和主要字符。这是一个不合时宜的想法。