c++ - 进程终止,状态为 -1073741571(0 分钟,3 秒)

标签 c++ c++17

构建此代码后,出现此错误:进程终止,状态为 -1073741571(0 分钟,0 秒)。那么我应该怎么做才能解决这个问题呢?

我正在使用 Code::Blocks 16.01。我已经尝试了很多次,但总是出现此错误。但是如果这段代码跑在Ideone上就没问题。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct matrix
{
    ll val[3005][3005];
    ll row, col;
};
matrix operator * (matrix a, matrix b)
{
    matrix res;
    if(a.col != b.row)
        return res;
    for(ll i = 1; i <= a.row; i++)
        for(ll j = 1; j <= b.col; j++)
            for(ll k = 1; k <= a.col; k++)
                   res.val[i][j] = res.val[i][j] + a.val[i][k] * b.val[k] 
[j];
    res.row = a.row; res.col = b.col;
    return res;
}
matrix a,b,c;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>a.row>>a.col>>b.row>>b.col;
    for(ll i = 1; i <= a.row; i++)
        for(ll j = 1; j <= a.col; j++)
            cin>>a.val[i][j];
    for(ll i = 1; i <= b.row; i++)
        for(ll j = 1; j <= b.col; j++)
            cin>>b.val[i][j];
    c = a * b;
    for(ll i = 1; i <= c.row; i++)
    {
        for(ll j = 1; j <= c.col; j++)
            cout<<c.val[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

非常感谢您的帮助!

最佳答案

正如之前的一些评论所提到的,您很可能会在这里遇到堆栈溢出问题。线程的默认堆栈大小取决于平台,因此您的代码在某些环境中会导致崩溃,但在其他环境中可以正常工作是有道理的。

捕获此问题的一种可能方法是使用 AddressSanitizer 运行它启用。例如(我在“main.cc”中有你的代码):

$ g++ main.cc
$ ./a.out
Segmentation fault
$ g++ -fsanitize=address main.cc
$ ./a.out
ASAN:DEADLYSIGNAL
=================================================================
==224881==ERROR: AddressSanitizer: stack-overflow on address 0x7ffc3567b098 (pc 0x5586c57fe932 bp 0x7ffc39b5fd40 sp 0x7ffc3567b0a0 T0)
    #0 0x5586c57fe931 in main (~/a.out+0x2931)
    #1 0x7fddf00c052a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2352a)
    #2 0x5586c57fe509 in _start (~/a.out+0x2509)

SUMMARY: AddressSanitizer: stack-overflow (~/a.out+0x2931) in main
==224881==ABORTING

仅出于教育目的(我建议实际这样做),如果我们手动增加堆栈限制,我们可以观察到您的程序正在运行。在 Linux 上,如果我们插入

struct HackRunBeforeMain {
  HackRunBeforeMain() {
    // See http://man7.org/linux/man-pages/man2/getrlimit.2.html
    // Not checking any errors to keep the example simple.
    struct rlimit rlim;
    getrlimit(RLIMIT_STACK, &rlim);
    // Set the current thread's stack size to 1GB!
    rlim.rlim_cur = 1024 * 1024 * 1024;
    setrlimit(RLIMIT_STACK, &rlim);
  }
};
HackRunBeforeMain hack_run_before_main;

进入你的程序,运行它不会导致段错误(至少在我的机器上)。

对于长期修复,您应该考虑确保每个 matrix的数据在堆上,而不是栈上。您可以通过 malloc 等工具完成此操作, new , 或 std::make_unique<T> .为此修改原始程序作为练习留给提问者。

关于c++ - 进程终止,状态为 -1073741571(0 分钟,3 秒),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56705874/

相关文章:

C++ 之类的转换与 C 之类的转换?

c++ - 模板推导指南似乎不起作用

c++ - 如何让非成员 get<N> 为命名空间中的自定义类工作 [C++17]

c++ - [[nodiscard]] 到一个函数指针

c++ - std::ignore 与结构化绑定(bind)?

c++ - 检查枚举类是否包含特定标识符

c++ - 使用 OpenGL 风扇而不是根据不同的位置创建圆有什么好处?

c++ - 使用堆栈将字符串格式的小数转换为 double

c++ - 是否有任何不属于 C++ 标准库的 STL header ?

c++ - 堆分配问题