Все современные операционные системы хитро реализуют проверку разыменования нулевого указателя без каких-либо накладных расходов при использовании аппаратного обеспечения управления виртуальной памятью. Страница 0-й 4 КБ (или в данном случае 0-15-й страницы (всего 64 КБ)) настроена таким образом, что любое чтение или запись данных или выполнение инструкции по адресу 0 (или 0x00000FFF или 0x0000FFFF в этом отношении) мгновенно приводит к доступу исключение нарушения.
Позвольте мне сказать по-другому. Преобразование разыменования нулевого указателя в 0, но разрешение ссылок на данные, скажем, по адресу 1, будет непомерно дорогим - поскольку вы не можете использовать аппаратное обеспечение VM с гранулярностью страницы, вместо этого потребуется выполнить сравнение нулевого указателя и последовательность ветвлений до многих указателей разыменования. Сделав первую или несколько первых страниц недоступными, эту проверку можно выполнить «бесплатно» в оборудовании виртуальной машины. Недостатком является то, что вы не можете использовать эти первые страницы ни для чего другого.
(Теоретически, тогда можно было бы использовать достаточно оптимизирующий компилятор, чтобы определить, какие разыменования указателей не могут быть разыменованиями нулевых указателей, но пока не появятся такие умные компиляторы, придётся делать несопоставленный 0-страничный трюк.)
Так почему раздел назначения пустых указателей в Windows (после Win98) составляет 64 КБ вместо минимально необходимых 4 КБ? Ответ Вайзарда также хорошо подходит для обнаружения ошибок индекса массива нулевых указателей.
* Позднее обновление: RE: почему 64 КБ? - Я спросил кого-то, кто должен знать о команде Windows Core, и они сказали, что это, вероятно, область размером 64 КБ, потому что Windows сохраняет определенные структуры управления памятью с гранулярностью выделения 64 КБ. Это почему? Я не знаю, но, возможно, у Раймонда Чена есть ответ: http://blogs.msdn.com/b/oldnewthing/archive/2003/10/03/55239.aspx. Ух ты. *