为啥此代码会为大输入提供分段错误

Posted

技术标签:

【中文标题】为啥此代码会为大输入提供分段错误【英文标题】:Why this code is giving segmentation fault for large input为什么此代码会为大输入提供分段错误 【发布时间】:2021-01-20 12:43:24 【问题描述】:

这是一个简单的 dfs 程序,计算顶点为 1 的组件中的边数。

测试用例:https://www.dropbox.com/s/4844zj7xnp4qw77/test.txt?dl=0 我不知道为什么会出现分段错误; 请帮我解决这个错误。

#include<bits/stdc++.h>
using namespace std;
const int MXN = 1e6 + 2;

vector<int> adj[MXN];
int vis[MXN];
int n;
long long edges=0;
void dfs(int x) 
    edges+=adj[x].size();
    vis[x]=1;
    for (int i=0;i<adj[x].size();i++) 
        int y=adj[x][i];
        if ( !vis[y]) 
            dfs(y);
        
    

void solve() 
    cin >> n;
    for(int i=0;i<n-1;i++ ) 
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    
    dfs(1);
    cout<<edges/2<<endl;



int main() 

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cout << fixed << setprecision(6);
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    int t = 1;
    while (t--) 

        solve();

    




【问题讨论】:

考虑图是一个包含一百万个元素的链表,以及递归的深度。 您是否将此程序加载到像 gdb 这样的调试器并重复测试?这应该给你位置。您还应该能够显示调用堆栈和评估变量。 yes gdb 在 C:\Users\hp\CLionProjects\untitled2\ankit.cpp:10 10 edges+=adj[x].size(); [线程 13420.0x37dc 退出,代码 3221225725] [线程 13420.0x2004 退出,代码 3221225725] 这个测试用例的递归大约是 2e5。我认为这是可能的 输入是一个有效的二叉树 【参考方案1】:

如果您使用的是基于 unix 的操作系统,请尝试编译后进行

ulimit -s unlimited

这会将您的堆栈大小设置为无限,并且应该消除堆栈缓冲区的溢出。

【讨论】:

以上是关于为啥此代码会为大输入提供分段错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?

为啥此代码部分返回“分段错误”错误?

为啥我的代码中出现分段错误(核心转储)错误?

为啥在此代码中调用虚拟方法时会出现分段错误?

为啥存储此向量时会出现分段错误?

为啥在使用 Python/C API 时会出现此段错误?