a
[и b
] никогда не инициализировались , поэтому они могут иметь любое значение.Получаемые ими значения - это то, что происходит в соответствующих местах памяти кадра стека main
до вызова main
.То есть a
и b
являются переменными области действия , поэтому они находятся в фрейме стека функции.
В вашем случае b
получил 0x0, а a
получилненулевое значение, которое кажется действительным, но оно не .Он может указывать на в любом месте в физическом адресном пространстве программы.Мы не знаем, где это.Если мы читаем из него, это может быть за пределами назначенного / действительного / сопоставленного адресного пространства программы, и мы тоже получим ошибку по этому поводу.
Или, если мы напишем в местоположение, которое a
указывает на то, что мы можем писать в любое местоположение.Таким образом, мы можем испортить данные программы в произвольном месте.Это может не генерировать исключение сразу, но последствия неизвестны.Мы могли бы перезаписывать значения в сегменте данных.
Это может привести к тому, что программа выдаст неверные результаты позже, потому что значение данного значения в сегменте данных равно , а не .статически назначенный.
Или, возможно, мы искажаем значение, содержащееся в другой переменной указателя в глобальном пространстве памяти, которое было назначено статически.Позже, разыменование того, что указатель может [, вероятно, ] вызвать ошибку segault
Может даже указывать на защищенную память, такую как сегмент кода, который [снова]сгенерировать segfault.