Процесс завершен со статусом -1073741571 (0 минут, 3 секунд) - PullRequest
1 голос
/ 21 июня 2019

После создания этого кода я получаю эту ошибку: Процесс завершен со статусом -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;
}

Большое спасибо за помощь!

1 Ответ

1 голос
/ 26 июня 2019

Как упоминалось в некоторых предыдущих комментариях, вы, скорее всего, столкнетесь с проблемой переполнения стека. Размер стека по умолчанию для потока зависит от платформы, поэтому имеет смысл, что ваш код может привести к сбою в некоторых средах, но работать в других.

Возможный способ решить эту проблему - запустить ее с включенным 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;

в вашу программу, ее запуск не приводит к segfault (по крайней мере, на моей машине).

Для долгосрочного исправления вы должны убедиться, что все данные matrix находятся в куче, а не в стеке. Вы можете сделать это с помощью таких инструментов, как malloc, new или std::make_unique<T>. Изменение исходной программы для этого оставлено на усмотрение задающего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...