Консультация № 189668
05.08.2016, 13:35
0.00 руб.
0 8 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Код:
#include <stdio.h>
#include <stdlib.h>

void main()
{
long n = 1000;

long a[n][n];
long b[n][n];
long c[n][n];

for(int i = 0; i < n; i++)
for (int j=0; j<n; j++)
{
a[i][j] = i+j;
// b[i][j] = 0; //Если раскомментировать, то возникает ошибка
}
}


Если раскомментировать присвоение значения массиву b то возникает ошибка "Ошибка сегментирования".
Если в переменную n вместо 1000 поставить 100, то присвоение значения массиву b проходит без ошибок.
Не могу понять, где проблема.

Обсуждение

давно
Посетитель
7438
7205
05.08.2016, 14:26
общий
05.08.2016, 14:47
Адресаты:
Все правильно! Кто ж столько выделяет в стеке? :)
Не знаю, как в Вашей среде, в моей студии под стек, по-умолчанию, выделяется 0x100000 = 1048576, т.е всего 1Мб
а Вы хотите разместить там 12 (!) Мб. Вот и имеете переполнение стека.
У Вас, возможно, размер стека чуть больше, но при записи в b, очевидно, пытаетесь получить доступ за пределы сегмента данных(стека)
Полагаю, Вы пробуете создать release-версию. Если попробуете debug, то получите вылет на этапе инициализации локальных переменных!
Выход: под массивы выделять память динамически (кстати, куча тоже имеет предел!) или увеличить размер стека для программы
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
05.08.2016, 14:54
общий
05.08.2016, 14:56
Адресаты:
Гм... А если у меня размер матрицы известен заранее, всё равно память под неё надо выделять в процессе работы программы? Или можно стек увеличить до бесконечности (разумной )?
У меня GCC 6.1. Стек по умолчанию 8 МБ.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
05.08.2016, 15:06
общий
05.08.2016, 15:08
Адресаты:
А что меняется от того, что размер известен заранее? Массивы-то надо где-то разместить...
Неважно где. Если в стеке, так надо задать необходимый размер стека (ест-нно, в разумных пределах).
Если выделять динамически, то в куче вряд ли получится, ее размер наверняка тоже 8Мб. (Можно создать свою кучу!)
Проще всего запросить динамически у системы.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
05.08.2016, 15:13
общий
Адресаты:
Еще можно создать временный файл и сделать отображение его в память.
Кстати, частенько так работаю с готовыми файлами. Удобно! Файл, а работаешь с ним, как с обычным массивом данных...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
05.08.2016, 15:27
общий
Адресаты:
Еще вариант: уменьшить int до short.
Тогда надо будет не 12Мб, а всего 6Мб. Что уже помещается в 8Мб
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
05.08.2016, 18:20
общий
Адресаты:
Да, на счёт типа short надо подумать, спасибо. Проанализирую свои данные на счет того, какое там может быть максимальное значение, возможно тогда удасться обойтись статическими данными.
Цитата: Лысков Игорь Витальевич
Если выделять динамически, то в куче вряд ли получится, ее размер наверняка тоже 8Мб.

Динамически я уже делал, там всё пучком. Матрицы по 10 000 размером. Я думал, что со статичискими переменными инициализация их будет проходить быстрее.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Старший Модератор
17042
808
09.08.2016, 16:43
общий
Адресаты:
Игорь Витальевич, оформите ответ?
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
10.08.2016, 10:42
общий
это ответ
Здравствуйте, Вадим Исаев ака sir Henry!

Цитата: Лысков Игорь Витальевич
Все правильно! Кто ж столько выделяет в стеке?Не знаю, как в Вашей среде, в моей студии под стек, по-умолчанию, выделяется 0x100000 = 1048576, т.е всего 1Мб а Вы хотите разместить там 12 (!) Мб. Вот и имеете переполнение стека. У Вас, возможно, размер стека чуть больше, но при записи в b, очевидно, пытаетесь получить доступ за пределы сегмента данных(стека) Полагаю, Вы пробуете создать release-версию. Если попробуете debug, то получите вылет на этапе инициализации локальных переменных! Выход: под массивы выделять память динамически (кстати, куча тоже имеет предел!) или увеличить размер стека для программы


(По материалам мини-форума).
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа