【发布时间】:2017-10-16 22:56:51
【问题描述】:
我在hackerrank上做一个编码问题,我的代码在我的系统上成功运行,但在提交解决方案时出现分段错误。请帮帮我。已经坚持了几个小时。但是找不到问题。
HackerRank 问题: https://www.hackerrank.com/challenges/torque-and-development
这是我的代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,cRoad,cLib;
void initialize(bool visited[])
{
int i ;
for(i=0;i<=n;i++)
{
visited[i] = false ;
}
}
void dfs(vector <int> arr[],bool visited[],int node,int &numOfNodes)
{
int i,j;
for(i=0;i<arr[node].size();i++)
{
if(visited[arr[node][i] ] == false )
{
visited[arr[node][i] ] = true ;
dfs(arr,visited,arr[node][i],numOfNodes);
}
}
numOfNodes ++ ;
}
int minCost(vector <int> arr[],bool visited[])
{
int cost = 0;
int i , connectedComponents =0;
if(cLib < cRoad)
return (n * cLib);
else
{
for(i=1;i<=n;i++)
{
int numOfNodes = 0 ;
if(visited[i]==false)
{
dfs(arr,visited,i,numOfNodes);
connectedComponents++;
cost += (numOfNodes - 1 ) * cRoad + cLib ;
}
}
return cost ;
}
}
int main()
{
int q,u,v,i,j;
scanf("%d",&q);
while(q--)
{
scanf("%d %d %d %d",&n,&m,&cLib ,&cRoad);
vector <int> arr[n];
bool visited[n];
initialize(visited);
for(i=0;i<m;i++)
{
scanf("%d %d",&u,&v);
arr[u].push_back(v);
arr[v].push_back(u);
}
cout<<minCost(arr,visited);
}
}
示例输入:
2
3 3 2 1
1 2
3 1
2 3
6 6 2 5
1 3
3 4
2 4
1 2
2 3
5 6
样本输出:
4
12
Hackerrank 错误:
GDB 跟踪:
从解决方案中读取符号...完成。
[新 LWP 14235]
核心是由“解决方案”生成的。
程序因信号 SIGSEGV 终止,分段错误。
/#0 0x00000000004009d9 在 __gnu_cxx::new_allocator::construct (this=0x7ffdbd2b9738, __p=0x1)
在 /usr/include/c++/6/ext/new_allocator.h:120
120 { ::new((void *)__p) _Up(std::forward<_args>(__args)...); }
/#0 0x00000000004009d9 在 __gnu_cxx::new_allocator::construct (this=0x7ffdbd2b9738, __p=0x1)
在 /usr/include/c++/6/ext/new_allocator.h:120
/#1 std::allocator_traits >::construct
(
__a=..., __p=0x1) 在 /usr/include/c++/6/bits/alloc_traits.h:455
/#2 std::vector >::push_back (
__x=@0x7ffdbd2b9754: 1, 这=0x7ffdbd2b9738)
在 /usr/include/c++/6/bits/stl_vector.h:918
/#3 main() at solution.cc:76
【问题讨论】:
-
首先:“向量
arr[n];”不会创建大小为 n 的向量 ,它会创建大小为 n 的向量 的数组。你应该把它改成“vector arr(n);” -
这里我正在制作一个大小为 n 的向量数组。
-
不,您至少不是您发布的代码:)。就像
a[n];创建一个 n 倍于数据类型大小的内存位置,并在其中初始化 n 个数据实例,并将该内存块的开始地址存储在变量 a 中。所以你的数据类型恰好是vector 。使用你会看到的调试器。正确的语法是 vector a(n); -
例子:我做了vector
a(n);和 vector 初始化时打印这些数据元素的方式b[n]: 在 gdb 中,这是使用 n =2 -
(gdb) 打印 $1 = {<:_vector_base std::allocator> >> = { _M_impl = {<:allocator>> = {> = {},},_M_start = 0x60005bc60,_M_finish = 0x60005bc68,_M_end_of_storage = 0x60005bc68}},}
标签: c++ segmentation-fault graph-algorithm