2015-05-04 3 views
2

Я всегда задавался вопросом, почему данные мусора кажутся не имеющими смысла. Для ясности, что я имею в виду под «мусором», это данные, которые, как бы то ни было, находятся на определенном адресе памяти, к которому у вас есть доступ, из-за чего-то вроде забывания инициализировать переменную.Почему данные «мусора» не имеют смысла?

Например, распечатав неиспользуемый массив дал мне это:

@°õN)0ÿÿl¯ÿ¯ÿ ``¯ÿ¯ÿ @`¯ÿø+))0 wy¿[d 

Очевидно, что это бесполезно для моего приложения, но оно также кажется, что это не что-нибудь полезное для любого применения. Почему это? Может быть, есть какая-то защита данных?

+0

Почему, по вашему мнению, это бесполезно? Это не имеет смысла как строка, но, вероятно, это не строка. – user2357112

+2

Вы предполагаете, что «полезные данные» представлены в виде простого текста. Целые числа, числа с плавающей запятой, указатели и т. Д., Безусловно, полезны, но, пытаясь их прочитать, текст ASCII доставит вам мусор. –

+2

Потому что вы вынуждаете его интерпретировать некоторые случайные данные как символы. 32 может быть 32, или пробелом, или что-либо еще в другом кодировании. Данные имеют смысл только в правильном представлении (таким образом, системы типов). – Carcigenicate

ответ

1

Как вы заявляете в вашем вопросе:

... «мусора» данные, что только то, что случается по определенному адресу памяти, что у вас есть доступ к из-за чего-то, как забыть инициализировать Переменная.

Это означает, что раньше было что-то еще в этой памяти, прежде чем вы использовали его для своей переменной. Все, что имело место, может иметь или не иметь никакого отношения к тому, как вы хотите использовать переменную. То есть, большинство языков не заставляют память, используемую для повторного использования одного типа объекта для одного и того же типа.

Это означает, что если память использовалась для хранения указателя, а затем отпущена, эту память можно использовать для хранения строки. Если значение указателя было зачитано, как если бы оно было строкой, может появиться что-то похожее на мусор. Это связано с тем, что байты, используемые для представления значения указателя, не ограничиваются значениями, которые соответствуют значениям ASCII для печати.

Обычный способ обнаружения переполнения буфера произошел в программе, чтобы проверить значение указателя и посмотреть, содержит ли он печатные значения ASCII. В этом случае пользователь памяти как указатель видит мусор, но в этом случае он «печатаем».

+0

Спасибо за очень четкое объяснение! – user3424612

+0

Добро пожаловать. – jxh

1

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

Именно по этой причине одна из худших ошибок в истории, совсем недавно, cf , https://xkcd.com/1354/. Где вы живете, чтобы пропустить это?

 Смежные вопросы

  • Нет связанных вопросов^_^