Как упоминалось в некоторых предыдущих комментариях, вы, скорее всего, столкнетесь с проблемой переполнения стека. Размер стека по умолчанию для потока зависит от платформы, поэтому имеет смысл, что ваш код может привести к сбою в некоторых средах, но работать в других.
Возможный способ решить эту проблему - запустить ее с включенным 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>
. Изменение исходной программы для этого оставлено на усмотрение задающего.