Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Порядок объявления переменных

1.9K
06 октября 2007 года
Anton Chik
175 / / 26.09.2005
извиняюсь если спрашиваю какую-то глупость (убейте, поиском не воспользовался), но вот стало интересно почему если в рабочем коде :
 
Код:
TButton **b;
 int z;
 int n=10;
 for (z=0;z<n;z++)
  {
   b[z] = new TButton(Application);
   b[z]->Parent = Form1;
   b[z]->Visible=true;
  }

объявить **b после z и n, т.е. вот так
 
Код:
int z;
 int n=10;
 TButton **b;
 for (z=0;z<n;z++)
  {
   b[z] = new TButton(Application);
   b[z]->Parent = Form1;
   b[z]->Visible=true;
  }

то в строке
 
Код:
b[z] = new TButton(Application);

вылетает access violation ???!
3
06 октября 2007 года
Green
4.8K / / 20.01.2000
Потому, что ты обращаешься по невалидному указателю.
Где ты выделяешь область памяти под массив, по которому далее итерируешься - b[z] ?
Для начала его надо создать.
1.9K
06 октября 2007 года
Anton Chik
175 / / 26.09.2005
почему тогда работает первый код?
8.9K
06 октября 2007 года
Yan Tsys
23 / / 07.01.2005
Цитата: Anton Chik
почему тогда работает первый код?



Ты с переменной на которую выделено место на один указатель работаешь как с массивом указателей.

В этом случае записываемые тобой значения сохраняются в то место которое располагается сразу за этой переменной.

Что будет находится в участке памяти который ты портишь заранее точно сказать нельзя, зависит от компилятора, но что можно сказать точно это то что неправильный и первый код и второй, вопрос в том что в одном случае ты замечаешь это сразу а в другом возможно увидишь это позже...

В коде откомпилированной и запущенной программы есть места которые занимают память и не используются, что то в заголовке файла, если какой-то кусок кода используется в начале исполнения программы и в дальнейшем не нужен то занятое им место можно безвредно портить, какой-то кусок кода нужен при обращении к библиотекам Windows которые твоей программе и не нужны (пока не нужны)...

В твоем случае во втором варианте кода опасная область необъявленного массива находится ближе к коду цикла и вероятность проявления ошибки становится больше


PS Вопрос типа: Почему если я удаляю из папки Windows один из файлов она виснет а если другой то нет, в какой очередности их нужно удалять правильно? :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог