Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2011, 00:35   #1
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию Переполнение стека в самом начале программы

Всем привет! У меня такая проблема: запускаю программу, и при входе в функцию main она вылетает с ошибкой Необработанное исключение в "0x004171e7" в "PracticeMPI.exe": 0xC00000FD: Stack overflow.
Ни одной операции не было сделано! Вылетела прям на входе. Код выкладывать не стал, т.к. оооочень много, да и не весь мой. У кого какие мысли? Поделитесь.
JuniorProger вне форума Ответить с цитированием
Старый 27.12.2011, 00:39   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

тут вообще то... программисты, а не телепаты...
_Bers вне форума Ответить с цитированием
Старый 27.12.2011, 00:41   #3
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Я просто не знаю даже что сюда еще написать. Вылетает на строке int main(int argc, char* argv[]){
JuniorProger вне форума Ответить с цитированием
Старый 27.12.2011, 00:55   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может какие глобальные объекты косячат?
вообще это гадание на кофнйной гуще...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.12.2011, 03:35   #5
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Попробовал поискать ошибку методом комментирования строк (ставить // перед различными строками кода), т.к. дебагером не нашел. Понял, что вылет не происходит, если "закомментировать" строки с созданием двумерного массива (матрицы). У меня в программе есть тип
Код:
typedef struct{              
	long double Coef1, Coef2;
} TNewStruct;
и создается массив
Код:
TNewStruct Structure1[N1][N1];
Если N1 = 254 или более, то программа вылетает. А если 253 и менее, то все работает нормально. Причем когда я создавал динамический двумерный массив, все работало нормально с гораздо большими матрицами (4096Х4096). Наверное это связано с тем, что не удается выделить непрерывный участок памяти для статического массива такого размера. А в случае с динамическим массивом память выделяется не непрерывно, поэтому все работает. Так?

Последний раз редактировалось JuniorProger; 27.12.2011 в 03:37.
JuniorProger вне форума Ответить с цитированием
Старый 27.12.2011, 03:46   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Так?

не так. Память выделяется непрерывно в любом случае.
Просто во втором случае она выделяется не из кучи, а из стека, размер которого ограничен.
Либо увеличивайте стек, либо не храните такие большие объёмы в нём.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.12.2011, 12:45   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от JuniorProger Посмотреть сообщение
Попробовал поискать ошибку методом комментирования строк (ставить // перед различными строками кода), т.к. дебагером не нашел. Понял, что вылет не происходит, если "закомментировать" строки с созданием двумерного массива (матрицы). У меня в программе есть тип
Код:
typedef struct{              
	long double Coef1, Coef2;
} TNewStruct;
и создается массив
Код:
TNewStruct Structure1[N1][N1];
Если N1 = 254 или более, то программа вылетает. А если 253 и менее, то все работает нормально. Причем когда я создавал динамический двумерный массив, все работало нормально с гораздо большими матрицами (4096Х4096). Наверное это связано с тем, что не удается выделить непрерывный участок памяти для статического массива такого размера. А в случае с динамическим массивом память выделяется не непрерывно, поэтому все работает. Так?
Сколько будет sizeof(TNewStruct)*N1*N1 ?
Скорее всего ты пытаешься создать массив на стеке.
Если бы это была статик, или куча - должно было бы сработать)

Можно вылечить:
1. Создавать в статической области памяти (например, в глобальном пространстве)
2. Создавать динамически, на куче.
_Bers вне форума Ответить с цитированием
Старый 27.12.2011, 20:03   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Память выделяется непрерывно в любом случае.
нет, динамические двухмерные массивы это массив массивов, массив указателей на указатель на <тип>.

методы решения сказал _Bers.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.02.2012, 17:11   #9
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Всем спасибо! Закрывайте.
JuniorProger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SendMessage переполнение стека LesnikFFF Общие вопросы Delphi 5 01.07.2011 15:02
Переполнение аппаратного стека Levsha100 Свободное общение 6 13.07.2010 01:59
Переполнение стека NoHeart Общие вопросы Delphi 8 08.11.2009 16:03
Переполнение стека Ake Паскаль, Turbo Pascal, PascalABC.NET 3 30.05.2009 22:39
Переполнение Стека Викдон Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 19:16