Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Статические и динамические массивы, выделение памяти  (Прочитано 14895 раз)
0 Пользователей и 1 Гость смотрят эту тему.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 12-10-2005 15:49 » 

Вчера столкнулся с определенным казусом, я его сейчас опишу, хотелось бы  прочитать ваши комментарии.
Возникла необходимость выделить такой массив: double  Tmass[100000][10];
Как видите, памяти расходуется немало. Первоначально я делал так:
Код:
double **Tmass;
 Tmass=new double *[tmax/deltat];
for(int i=0;i<X/deltax;i++)
Tmass[i]=new double [X/deltax];
Но врезультате этого начало происходить следующее. Выделение памяти прошло вробе бы нормально, без эксцессов. А вот затем при обращении к элементу Tmass[10][0] вылетает следующее послание
Цитата
Unhandled exception in lab1.exe:0xC0000005:Access Violation

Я долго сморел на это сообщение и не сразу принял решение о статическом массиве. Т.е. я сделал так
double  Tmass[100000][10];
И все беды улетучились.
Но эта ситуация породила во мне множество вопросов  и поставила в неопределенный тупик.
Я понимаю, что с помощью оператора new память выделяется в куче, когда же Tmass[...][...] то в области данных (или это по-другому как-то называется?) и я так понимаю, эти участки памяти отличаются по объему, но
1) Почему ошибка произошла именно на элементе [10][0]? Я понимаю, если бы на элементе [90000][0], а то что-то слишком рано.
2)Бывало ли с кем-нибудь такое? И что же мне делать, если мне  надо выделить динамически столько памяти? Может я что-то не так делал?
3)Мне приходилось испоьзовать вектор. Его размерность в 3 раза больше размерности массива Tmass. Я так понимаю, в векторе память тоже выделяется динамически, тогда почему с ним не возникает таких проблем, которые возникли с массивом.
Среда разработки Visual C++6.0.
Чувствую скоро появятся еще вопросы. 
Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 12-10-2005 16:20 » 

nikedeforest Чему у тебя равно X/deltax. Если 10. Тогда все ясно. Здесь:
Код:
for(int i=0;i<X/deltax;i++)
Tmass[i]=new double [X/deltax];
Ты иницилизируеш только 10 элементов. Следовательно Tmass[10][0] не иницилизирован уже.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 12-10-2005 17:19 » new

Мда, все оказалось намного проще. И зря я так всполошилсяф и спасибо Finch, что указал, на эту ошибку.
правильно было бы так
Код:
double **Tmass;
Tmass=new double *[];
for(int i=0;i<tmax/deltat;i++)
Tmass[i]=new double [X/deltax];

Finch, еще раз спасибо.
Странно, второй раз допускаю глупую ошибку за полторы недели, к чему бы это.
Записан

ещё один вопрос ...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines