Что происходит, когда вы инициализируете ненужное значение в C? - PullRequest
6 голосов
/ 22 февраля 2011

Предположим, что у нас есть следующее:

int main(void) {
   char* ptr;

   printf("%c\n",ptr[24]);  // junk value

   ptr[24] = 'H';

   printf("%c\n", ptr[24]);  // prints H

   return 0;
}

Когда я изменяю значение барахла на что-то другое, это означает, что я искажаю память или это значение буквально мусор, поэтому не имеет значения, какое новое значениеЯ назначаю на это?

Ответы [ 3 ]

6 голосов
/ 22 февраля 2011

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

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

ptr - это указатель, унифицированный как единица, то есть значение указателя еще не определено.Неопределенный указатель, по определению, указывает на ничто и все, то есть не на действительный объект вообще.Единственный способ сделать этот указатель действительным - это присвоить ему адрес соответствующего объекта C того типа, на который ссылается указатель.

Кстати: на простом языке C очень и очень строгие правила печати.Я иногда говорю, что он даже строже, чем C ++, потому что в нем отсутствуют оператор неявного преобразования и перегрузка функций.Но его небрежное приведение типов и плохие компиляторы разрушили его репутацию в отношении безопасности типов.

5 голосов
/ 22 февраля 2011

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

2 голосов
/ 22 февраля 2011

Поскольку большинство реализаций C позволяют вам получать доступ к недопустимым ячейкам памяти, вы фактически присваиваете значение 'H' этой позиции.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...