Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/30: Рейтинг темы: голосов - 30, средняя оценка - 4.57
31 / 30 / 2
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1

"Stack overflow" как обойти?

27.01.2014, 00:17. Показов 6652. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Дело в том, что при объявлении массива размером 106
C++
1
int a[1000000];
выскакивает при запуске (после компиляции даже) stack overflow, еще до того как туда будут заноситься элементы. Дебаггер указывает именно сюда... Тем более если сделать 105, то все работает... Прошу объяснить как это обойти... Заранее спасибо.
Вот весь код (без кода функции двоичной сортировки quickSortR)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    int n, k, i, s=0;
    int a[100000];
    ifstream f1("E.dat");
    ofstream f2("E.sol");
    f1 >> n >> k;
    for (i = 0; i < n; i++) {
        f1 >> a[i];
    }
    quickSortR(a,n-1);
    for (i = k; i < n; i++) {
        s = s + a[i];
    }
    f2 << s;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.01.2014, 00:17
Ответы с готовыми решениями:

stack overflow
При запуске кода выдаёт Необработанное исключение по адресу 0x00493DD9 в vuz1.exe: 0xC00000FD: Stack overflow (параметры: 0x00000000,...

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

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

40
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
27.01.2014, 00:26
А в настройках компилятора ничего не меняли? Нормально принял VC++2012 ваш код. Я сам создавал массивы большей длины, тема до боли знакома. Но вы вроде к пределам возможностей 32 разрядной системы и близко не подошли.
0
31 / 30 / 2
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
27.01.2014, 00:35  [ТС]
mustimur, а вы в коде меняли на 1000000? А то я оставил случайно 100000... У меня VC++2013. Настроек не менял...
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
27.01.2014, 00:36
Проверьте, возможно где-то в файле есть число, большее чем 231-1 (2 147 483 647). Либо n>106.
0
31 / 30 / 2
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
27.01.2014, 00:38  [ТС]
Craw, да вот в том то и дело что чисел 6. И они все не привышают 100. И проблема начинается еще до заполнения. И как я говорил проблема пропадает, когда я меняю с 106 на 105...
0
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
27.01.2014, 00:45
Цитата Сообщение от SEVI Посмотреть сообщение
mustimur, а вы в коде меняли на 1000000? А то я оставил случайно 100000... У меня VC++2013. Настроек не менял...
Да тоже начал вылетать, но если записать так то работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
 
int main()
{
    int n, k, i, s=0;
    int *a=new int[1000000];
    ifstream f1("E.dat");
    ofstream f2("E.sol");
    f1 >> n >> k;
    for (i = 0; i < n; i++) {
        f1 >> a[i];
    }
    //quickSortR(a,n-1);
    for (i = k; i < n; i++) {
        s = s + a[i];
    }
     f2 << s;
     delete [] a;
     return 0;
}
Добавлено через 4 минуты
16 строчку раскоментировать забыл
0
31 / 30 / 2
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
27.01.2014, 00:47  [ТС]
mustimur, хм... интересно... а почему же тогда не работает тот вид записи... Спасибо! Учту...
Может я ошибаюсь, но этот вид записи используется при динамическом программировании... И получается память выделяется по мере заполнения?
0
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
27.01.2014, 00:54
Цитата Сообщение от SEVI Посмотреть сообщение
Может я ошибаюсь, но этот вид записи используется при динамическом программировании... И получается память выделяется по мере заполнения?
Да это динамический массив, но память по него выделяется полностью и сразу в момент определения, в данном случае когда программа доходит до 9 строчки, а освобождается на 21 строчке.
0
31 / 30 / 2
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
27.01.2014, 01:10  [ТС]
mustimur, кстати говоря у меня работает только без
C++
1
delete [] a;
0
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
27.01.2014, 01:15
А с ней ошибку выдает? Это строчка освобождения памяти выделенного под массив. В данном случае не обязательна так память освободится после выполнения программы, но если ты допустим организуешь цикл объявление, то это чревато утечками памяти
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.01.2014, 08:30
Должно быть полезно Почему прога может зависать при инициализации массива
1
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
27.01.2014, 10:35
Цитата Сообщение от Tulosba Посмотреть сообщение
Должно быть полезно Почему прога может зависать при инициализации массива
А думаете целесообразно менять размер стека? Я не рискнул бы давать такой совет, лучше память выделять динамически на кучи.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.01.2014, 10:40
Цитата Сообщение от mustimur Посмотреть сообщение
А думаете целесообразно менять размер стека?
Я и не рекомендую менять этот размер. См сообщение: Почему прога может зависать при инициализации массива
0
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
27.01.2014, 10:46
Цитата Сообщение от Tulosba Посмотреть сообщение
Я и не рекомендую менять этот размер.
Извините не внимательно прочел , просто общая мысль той темы изменение размера стека. Вы то как раз даете рекомендацию аналогично моей
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.01.2014, 10:49
mustimur, решений проблемы может быть несколько. Самое простое - изменить размер стека, но при этом оно не самое правильное.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.01.2014, 11:27
SEVI, что тебе мешает выделить память под массив динамически?
Очевидно же что не хватает стековой памяти.
0
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
27.01.2014, 11:27
Цитата Сообщение от Tulosba Посмотреть сообщение
mustimur, решений проблемы может быть несколько.
Я это прекрасно понимаю.
Цитата Сообщение от Tulosba Посмотреть сообщение
Самое простое - изменить размер стека, но при этом оно не самое правильное.
И тоже ясно, поэтому такой совет и дал.
Сформулирую иначе есть случаи в которых менять размер стека целесообразно по вашему? (если можно пример)
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.01.2014, 12:15
Цитата Сообщение от mustimur Посмотреть сообщение
есть случаи в которых менять размер стека целесообразно по вашему?
Если есть время и возможность переписать код, не увеличивая размер стека, то лучше так и сделать.
Иначе:
1. Когда есть готовая программа, требующая бОльшего стека.
2. Использование памяти на стеке быстрее, чем частое выделение/освобождение в куче. Хотя даже в этом случае можно выделить достаточный буфер в куче один раз и использовать его. Т.е. по сути сделать свой стек с блекджеком в куче.
0
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
27.01.2014, 12:59
Цитата Сообщение от Tulosba Посмотреть сообщение
Если есть время и возможность переписать код, не увеличивая размер стека, то лучше так и сделать.
Спасибо, в принципе так и думал
0
15 / 15 / 7
Регистрация: 20.11.2013
Сообщений: 92
27.01.2014, 16:01
Цитата Сообщение от Tulosba Посмотреть сообщение
mustimur, решений проблемы может быть несколько. Самое простое - изменить размер стека, но при этом оно не самое правильное.
Скажите, пожалуйста, почему изменять размер стека не самое целесообразное решение? И почему его лучше вообще не трогать? Если я правильно понимаю, то в защищенном режиме процессора ОС(в частности Windows 32bit), предоставляет памяти 4Гб, и если речь идет об объектах разумных размеров (скажем, до 100 мб), то для повышения быстродействия можно было бы использовать увеличенный стек, повысив тем самым скорость работы в 2 раза, по сравнению с кучей? Тогда по каким причинам так не поступают?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.01.2014, 16:01
Помогаю со студенческими работами здесь

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

stack overflow
Всем привет. пишу void test() { try { cout &lt;&lt; &quot;test \n&quot;; test(); } catch(exception e) {

Исключение Stack overflow
Всем привет. Помогите пожалуйста исправить ошибку. При компиляции, программа выдает исключение: Необработанное исключение по адресу...

stack overflow в предикате
Создать квадратную матрицу порядка n(порядок задается во время выполнения программы) //и заполнить ее случайными числами. Переставить...

Stack Overflow в сортировке
На малых размерах массива алгоритм отрабатывает, на больших уже нет. В чём может быть проблема? #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru