![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В tcc был сделан специальный хак для отлова таких записей (причем только в small модели), начало области данных (те самые нулевые адреса для коротких указателей) было зарезервированно и заполненно специальными данными (не помню какими), после окончания программы startup проверял, что эта область не изменилась, и если это оказывалось не так, то выводилось то самое сообщение про 'NULL pointer assignment' Отловить собственно МОМЕНТ присваивания автоматически увы не получится, только вручную по шагам. |
|||
|
||||
| nickless |
|
||||||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Короче, я сегодня добрый
В топку такой компилятор... Переменные, объявлённые в for, не видны за её(его) пределами. apook, код не только не соответствует стандарту, в нём еще просто много ошибок. Если подправить синтакс, программа вываливается с Segfault-ом (ака Access Violation), что в твоём древнем компиляторе наверно называется "Null Pointer Assignment" Ловится это очень просто, например в gdb так:
Со дебагером под дос разбирайся сам... Проблемы тут были в перепутаных DATSZ и _OODSZ (красивые названия кстати ...по принципу "чтобы никто не догадался", сам придумал?
Вот исправленый код:
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||||||
|
|||||||||
| Ln78 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
Вроде как scope переводилось как "область видимости", "область действия", а "время жизни" - это, скорее, lifetime. apook, опять хулиганишь? |
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
всё так и как, только вот как это относится к NPA не ясно. видимо и автору тоже. рассматривать какую-то проблему на изначально не верном коде не правильно. |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Молодец! Так к чему-же это привело, создан массив из 10 структур, в них двумерные массивы по "пять в одном", запускаем пять циклов и в каждом выделяем память для "десяти в одном", то есть по пять лишних для каждой структуры... Это не прокатывает с новым компилятором, а старый это проделывает. Надпись Null Pointer Assignment появляется при выходе из программы если сделать удаление правильно т.е не трогая лишние, так что-же тогдап получается такое в данном случае Null Pointer, пустой указатель или не существующий указатель? должно быть что не существующий в данном случае
??? Кстати может вылести по поводу любого указателя напр FILE *f и не обязательно смысл одинаков, одинаково во всех случаях только то что причина указатель -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Уточнил, там (с нуля) лежит надпись 'Borland C++ - Copyright 1991 Borland Intl.', и после завершения main производится подсчет ее контрольной суммы (просто сумма всех байтов), если она не совпала с ожидаемой - NULL pointer assignment Что касается 'любого указателя, например FILE*', то NULL указатель это не какой то специальный указатель, а вообще ЛЮБОЙ указатель, значение которого равно NULL (или 0, что однои тоже) И совсем не обязательно самому записывать что-то по такому указателю, это может сделать и библиотека компилятора, если использовать ее сервисы неправильно, например достаточно сделать 2 раза delete (или free) одного и того же указателя, при первом delete будет возвращена память в менеджер памяти (указанный блок памяти будет подвязан к списку свободных), при втором delete он будет подвязан еще раз, что приведет к искажению указателей из ДРУГИХ блоков на него, после чего вся куча оказывается разрушеной и последующие обращения к менеджеру памяти скорее всего вызовут записи по этим разрушенным поинтерам, которые вполне могут оказаться и нулевыми. С FILE* то же самое, библиотека может разрушить внутренние структуры если 2 раза вызвать fclose например. |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
-------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| apook |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Проблема вобщем в том что пишешь пишешь программу все идет правильно и когда строк кода стало много и включенных файлов тоже, вдруг откуда ни возьмись ......
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |