Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
1

Переполнение (Stack overflow)

27.06.2013, 16:25. Просмотров 1140. Ответов 15
Метки нет (Все метки)

Подскажите, пожалуйста, почему при перемещении
C++
1
int n, a[1000][1000], k;
в локальную область программа при открытии консоли выдаёт ошибку и не работает, а в глобальной области всё в порядке?

Отладка показывает Stack overflow.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# include <iostream>
using namespace std;
 
int main ()
{
    int n, a[1000][1000], k;
 
    cin >> n;
 
    for (int i = 1; i <= (n + 1) >> 1; ++i)
    {
        for (int j = i; j <= n - i + 1; ++j)
         a[i][j] = ++k;
        for (int j = i + 1; j <= n - i + 1; ++j)
         a[j][n - i + 1] = ++k;
        for (int j = n - i; j >= i; --j)
         a[n - i + 1][j] = ++k;
        for (int j = n - i; j > i; --j)
         a[j][i] = ++k;
    }
 
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
         cout << a[i][j] << " ";
        cout << "\n";
    }
 
    system ("pause");
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2013, 16:25
Ответы с готовыми решениями:

Stack overflow
Написал #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; #include &lt;math.h&gt; #include...

Stack overflow.
У меня в программе есть реверсивная функция (много параметров) она вызывает себя очень много раз....

Stack overflow
Реализовал структуру данных стек на связном списке, очистку решил возложить на деструкторы узлов,...

Почему stack overflow?
Почему приведенный ниже код сразу же приводит к переполнению стека? int _tmain(int argc,...

15
7 / 7 / 2
Регистрация: 02.03.2013
Сообщений: 69
27.06.2013, 16:31 2
Ух, ты! А что это значит : (n + 1) >> 1 ???
0
Модератор
Эксперт Python
26780 / 13995 / 2677
Регистрация: 12.02.2012
Сообщений: 22,940
Записей в блоге: 2
27.06.2013, 16:37 3
Потому, что ты создаешь массив 1000*1000*4=4млн. элементов в стеке. А когда переносишь массив на уровень модуля, он создается не в стеке.
1
276 / 275 / 83
Регистрация: 03.02.2013
Сообщений: 792
27.06.2013, 16:40 4
Цитата Сообщение от Korhall Посмотреть сообщение
Ух, ты! А что это значит : (n + 1) >> 1 ???
очевидно бинарный сдвиг на одит бит вправо, аналогично целочисленному делению пополам
1
7 / 7 / 2
Регистрация: 02.03.2013
Сообщений: 69
27.06.2013, 16:45 5
Спасибо, abit.
0
Ghost
173 / 173 / 40
Регистрация: 16.09.2012
Сообщений: 526
27.06.2013, 16:48 6
Цитата Сообщение от TyLinka Посмотреть сообщение
k;
Цитата Сообщение от TyLinka Посмотреть сообщение
++k;
в k мусор
надо
Код
k=0;
0
Модератор
Эксперт Python
26780 / 13995 / 2677
Регистрация: 12.02.2012
Сообщений: 22,940
Записей в блоге: 2
27.06.2013, 16:55 7
Цитата Сообщение от Belfegor Посмотреть сообщение
в k мусор
- но из-за этого stack overflow не возникнет.
0
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
28.06.2013, 19:47  [ТС] 8
Цитата Сообщение от Catstail Посмотреть сообщение
Потому, что ты создаешь массив 1000*1000*4=4млн. элементов в стеке. А когда переносишь массив на уровень модуля, он создается не в стеке.
То есть массивы такого размера можно задавать только в глобальной области?
0
Croessmah
28.06.2013, 20:04
  #9

Не по теме:

@Catstail, Зато возникают другие ошибки. А теперь мы не увидим от ТС вопроса "почему переменная k имеет не понятное значение" :)

0
Модератор
Эксперт Python
26780 / 13995 / 2677
Регистрация: 12.02.2012
Сообщений: 22,940
Записей в блоге: 2
28.06.2013, 20:13 10
Цитата Сообщение от TyLinka Посмотреть сообщение
То есть массивы такого размера можно задавать только в глобальной области?
в общем - да.
1
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
28.06.2013, 20:25 11
Размер статической памяти приложений, по моему, 2 ГБ; динамической для 32-разрядных - 2ГБ, для 64-разрядных - 8ТБ. А размер стека по умолчанию равен 1МБ, но его можно увеличить до 1ГБ (праметры линковщика).
Но это в основном все в теории.

@TyLinka, вот и получается, что вы без малого 4 МБ пытались засунуть в стек, который допускает максимальный размер 1МБ

Добавлено через 1 минуту
Это для Windows и VS, если что.
2
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
28.06.2013, 20:42  [ТС] 12
А при создании динамических массивов как быть?
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
28.06.2013, 20:44 13
В смысле?
0
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
28.06.2013, 20:46  [ТС] 14
Ну если мы создаём, например, двумерный динамический массив a[n][m] в локальной области, а потом вводим n = 1000, m = 1000, то тоже ошибку же выдаст?
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
28.06.2013, 20:49 15
В этом случае n и m должны быть константами известными на момент компиляции. Это в стек.
Если распределять память оператором new, то данные будут храниться в динамической памяти (макс. размер 2ГБ)
0
Грамотный. Безпорно.
16790 / 9687 / 1869
Регистрация: 27.09.2012
Сообщений: 24,049
Записей в блоге: 2
28.06.2013, 20:49 16
Так вообще делать нельзя. Разве что использовать нестандартные расширения компиляторов.
А вообще такие массивы будет лучше выделить в динамической памяти(копаем в сторону new/delete)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2013, 20:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Непонятный Stack Overflow
Здравствуйте, уважаемые форумчане.Столкнулся с непонятной мне проблемой при решении одной лёгкой...

Ошибка исполнения Stack overflow
Решил написать что-то вроде стратегии в консоле, но в итоге застрял в самом начале ( не могу найти...

Bitset<8388608> - Stack overflow
Пишу: bitset&lt;8388608&gt; hash; // (256^2)/2 Ошибка: Stakc overflow (ОЗУ&gt;3 Гб, но как я понял...

Разобраться с рекурсией: stack overflow
#include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;string&gt; #include&lt;math.h&gt; #include&lt;cmath&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.