Границы памяти, адресуемой указателем
Если любой указатель ссылается на неограниченную область памяти, то возникают резонные вопросы: где границы этой памяти, кто и как их определяет, кто и как контролирует нарушение этих границ указателем. Ответ на него неутешителен для начинающего программиста: транслятор принципиально исключает такой контроль как в процессе трансляции программы, так и в процессе ее выполнения. В последнем случае он не помещает в генерируемый программный код каких-либо дополнительных команд, которые могли бы это сделать. И дело здесь прежде всего в самой концепции языка Си: не включать в программный код ничего, не предусмотренного самой программой, и не вносить ограничений в возможности работы с данными (в нашем случае, с указателями). Но если это не заложено в сам язык (синтаксис), не поддерживается транслятором, то ответственность ложится целиком на работающую программу (точнее, на программиста, который ее написал). Более того, сам синтаксис языка в операциях с указателями не позволяет различить в конкретной точке программы, что подразумевается под этим указателем -указатель на отдельную переменную, массив (начало, середину конец...), какова размерность массива и т.д.. Все эти вопросы целиком находятся в ведении программы, которая решает их, исходя из общих принципов управления памятью, заложенных в языке (см.4.4).