|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.08.2014, 18:26 | #1 | |
Форумчанин
Регистрация: 03.03.2013
Сообщений: 102
|
Мусор (или определённое неопределённое)
Здравствуйте, уважаемые программисты! Приходилось ли Вам копаться в "мусоре"? Мне приходилось.
Началось всё с того, как мне захотелось написать собственную реализацию strcat() и strlen() (разумеется в собственном пространстве имён) и я столкнулся с следующей проблемой. В программе, тестирующей эти функции я объявил три строки: Код:
Вот так я реализовал strcat: Код:
Код:
Для первых двух строк strcat сработала как надо, но когда я применил её к третьей: Код:
Оказалось, что str3 не содержит ни одного "завершающего нуля"! При объявлении, 3-я строка содержит 80 значений -52, беззнаковое представление которых есть 204 в ASCII это русская 'M' или '╠'. При в воде в строку str3 n символов (n<80), первые n 'М' заменяются на символы, введённые с клавы, а остальные не меняются! А при инициализации первой строки все "оставшиеся" символы равны 0, поэтому с ним проблем нет. В strcat пришлось дописать Код:
Код:
Итак, как я понял, значение -52 для char есть ничто иное как "мусор". Эксперимент даёт следующие результаты для "мусора" других типов: Цитата:
Внимание! Bопросы: 1) Почему "мусор", который как я читал и считал должен иметь неопределённый результат имеет вполне определённые отрицательные значения? 2) Почему они именно такие? 3) Зависят ли эти значения от модели процессора, компилятора ОС или ещё чего? Очень надеюсь на ответы. Заранее благодарен. Последний раз редактировалось Haric_110; 06.08.2014 в 18:29. |
|
06.08.2014, 19:33 | #2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
06.08.2014, 19:51 | #3 |
Форумчанин
Регистрация: 03.03.2013
Сообщений: 102
|
Да, я согласен. Но почему неинициализированный символьный массив состоит из символов 'M'?
|
06.08.2014, 19:58 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
М.м.м. Я может глупость сморожу, но по моим догадкам это такая себе защита от... переполнения что ли... ССh это опкод прерывания INT3. Отладочное прерывание
Может загрузчик вставляет этот код, чтоб в случае нарушения доступа к памяти и попытка выполнить байты строки как код привела к вызову отладчика, типо сигнализируя - Ахтунг, что-то не так.
I'm learning to live...
|
06.08.2014, 20:07 | #5 |
Форумчанин
Регистрация: 03.03.2013
Сообщений: 102
|
Возможно. Тогда для других типов данных это тоже защита от антипереполнения?
Да, действительно, я проверил другие числа. Если учитывать память которую занимают объекты этих типов, то эти числа для каждого из них состоят из ССh. СС на каждый байт. Спасибо, Stilet! Последний раз редактировалось Stilet; 06.08.2014 в 20:27. |
06.08.2014, 20:27 | #6 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Наздоровье )
I'm learning to live...
|
06.08.2014, 20:40 | #7 |
Форумчанин
Регистрация: 03.03.2013
Сообщений: 102
|
Так это и есть то, что называют "мусором" или нет?
|
06.08.2014, 20:48 | #8 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Ну не похоже. Если это ставит менеджер памяти, то видимо это не мусор. Другое дело, если ты обьявил переменку, но не присвоил ей значение, то по факту ее адрес может указывать на память занятую кем-то до этого, и этот кто-то не обнулил после себя занятые ячейки. В результате код
Код:
I'm learning to live...
|
06.08.2014, 20:49 | #9 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Нет, это Debug сборка, где все переменный инициализируются в 0xCC.
В Release сборке содержимое будет случайным. Но в принципе да, это тоже можно считать мусором. |
06.08.2014, 21:35 | #10 |
Форумчанин
Регистрация: 03.03.2013
Сообщений: 102
|
Хорошо. Я понял. Будем считать, что в моём случае это не мусор, а пометка переменной "Пусто" - защита от антипереполнения, которая работает при Debug-отладке.
Спасибо! |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Dbgrid запрет на редактирование строки через определённое время | spotip | Компоненты Delphi | 11 | 30.04.2014 14:53 |
вставка нужного числа в определённое поле программы | Cai_i_iok | Помощь студентам | 8 | 06.04.2013 11:29 |
Определённое значение из доступных данных | Sprat | PHP | 2 | 29.03.2013 20:13 |
определённое место сайта+txt новости | Too | Работа с сетью в Delphi | 5 | 22.10.2011 21:23 |
цикл на определённое время | Nitrino | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 3 | 12.01.2010 13:57 |