C++程序在main之前崩溃
c++ program crashes before main
当我运行下面的代码时,程序崩溃,编译器消息是分段错误。我已经在我的代码中搜索了错误,但找不到任何错误。我的程序似乎甚至没有进入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
并且你没有验证a
和b
低于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的部分,因为你有一个结束行字符和主要字符。这是一个不合时宜的想法。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 代码在main()中运行,但在函数中出现错误
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- int main = 0,已编译但崩溃
- STD :: FSTREAM在使用预先分配的内存时在Main之后崩溃
- 当使用 /ENTRY:main 和 /MT 运行时库编译为 /SUBSYSTEM:WINDOWS 时,应用程序崩溃
- 如何在main()之前调试程序崩溃
- DBUS 代码在放置在守护进程内时崩溃,但在没有守护进程代码的独立独立 main() 函数中运行良好
- C++ Builder XE3 在 main() 之前运行和崩溃
- 我有一个 c++ 代码,它在启动时崩溃,然后到达问题所在 main() 的执行
- 代码运行良好,但从 main() 返回时崩溃
- C++程序在main之前崩溃
- 尝试使用 CreateProcess() ;没有编译器错误,但 main 不断崩溃
- 在main()之前崩溃
- 当从Xcode运行时,C++程序在main之前崩溃(但从命令行可以)