Осваиваю Си. Один момент мне пока не понятен.
Есть простой код:
void main(void)
{
int X, C;
int * P;
P = & C;
X = * P;
printf("X = %d\n", X);
}
При его выполнении никаких ошибок не выходит. Печатается мусор из памяти по адресу на который указывает P, потому, что C не инициализирован (ему не присвоено какое-либо значение). Тут всё понятно.
Едем дальше. Удаляю строчку:
P = & C;
Получаю следующий код:
void main(void)
{
int X, C;
int * P;
X = * P;
printf("X = %d\n", X);
}
Компилирую. Выполняю. Закономерно вываливается ошибка Segmentation fault. Всё верно. Программа попыталась обратится к памяти, которая ей не выделена. Переменная P не инициализирована и содержит мусор. Обращение к памяти на который указывает P - это UB. Т.е. существует крайне небольшая вероятность выполнения программы без ошибок, если P случайно укажет на разрешенный участок памяти. Тут мне тоже всё понятно.
Далее добавляю:
P = & C
после разыменовывания P;
void main(void)
{
int X, C;
int * P;
X = * P;
printf("X = %d\n", X);
P = & C;
}
И при выполнении этого кода программа выводит: "X = 1" и никаких ошибок. Запускаю программу несколько раз (с целью исключить вероятность случайного попадения указателя P на разрешенную память) и ... никаких ошибок.
Я в замешательстве.
Почему не выходит ошибка Segmentation fault при выполнении этого кода?
Я ведь обратился к памяти на которую указывает
неинициализированный на данный момент указатель P. Т.е. до того как переменная P была приравнена указателю на C.