@Resht
Beginner

Си: Почему не выходит ошибка Segmentation fault при выполнении этого кода?

Осваиваю Си. Один момент мне пока не понятен.
Есть простой код:
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.
  • Вопрос задан
  • 467 просмотров
Решения вопроса 1
terrier
@terrier
Обращение по адресу памяти, который не был выделен - это Undefined behaviour. Частным случаем такого поведения является Segmentation Fault или вывод значения 1 или все что угодно другое. Вы не можете ожидать какого-то определенного поведения от всей програмы, если в ней есть undefined behaviour.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы