pCar1 = (Car *) 0x104;
То, что вы здесь делаете, не допускается.Вы не можете привести абсолютный адрес (который в вашем случае относится к другому типу) и ожидать, что он будет работать.Чтобы сделать это, вы должны быть уверены, что адрес содержит правильный тип переменной во время выполнения.
В этом случае приведение предотвращает только предупреждение компиляции, потому что оно говорит компилятору: «Смотри, я знаю, что я»Я делаю, поверь мне, по этому адресу есть Car
.Конечно, когда ваша программа запускается и ожидает найти Car
в адресах 0x104
, когда ее нет, это приводит к неопределенному поведению.
Существует ли отказоустойчивый механизм или метод длясделать это глупое доказательство?
Абсолютно нет.С очень, очень далек от того, чтобы быть «глупым доказательством».Однако компилятор предупредил бы вас, если бы вы написали код «лучше»:
pCar1 = &fruit1; // Results in a compiler warning.
Как я могу предотвратить это?
Простоне делай этогоНе назначайте случайные адреса или адреса разных типов переменным.Единственное, что вы можете присвоить pCar1
, - это адрес другой переменной Car
(например, pCar1 = &car1
) или адрес ячейки памяти, где может храниться переменная Car
(например, результатподходящий malloc()
).
Итак, в конце концов:
Как работает проверка типа адреса указателя?
Нетt такая вещь, как «проверка типа адреса» в C. Только компилятор может предупредить вас о том, что что-то имеет неправильный тип для определенной переменной, , если вы даете ей возможность .Явное приведение в действие исключает этот шанс.