Нет, ничего остановит вас в этом. Арифметика указателя хорошо определена, это означает, что вы можете переместить указатель в любом направлении, чтобы указать на другое место. Но с этой настройкой вы не можете быть уверены, какую память вы на самом деле изменяете. Потому что во время компиляции оптимизаторы могут перемещать вашу переменную в другое место.
Как и в вашем случае, если все обтекаемое и прямое. Ваш порядок объявления переменных - это a, p и b. Предположим, что (a и b) получает x и p получает y байтов памяти в зависимости от вашей машинной архитектуры и ОС.
Ваша память должна выглядеть следующим образом:
________ __________________
| (a) x | (p) y | (b) x |
|________|_________|________|
, что означает, что ++ р будет оценивать р + SizeOf (р). Если «p» указывает на начало «a», это означает, что увеличение его на (y) байтов оставило бы «p» в области памяти «y» (при условии, что y> = x) или в «x» в противном случае. Таким образом, вы фактически модифицируете память p, а не b.
P.S: Мощность, предоставляемая C, должна быть лучше всего оставлена опытными программистами на С.
C не гарантирует защиту памяти. Вот почему это называется * неопределенным поведением *. – Kninnug
Нижняя линия - это segfault, которая защищает * другие * процессы. * «В маловероятном случае два a и b были написаны рядом друг с другом в памяти?» * Вы будете переписывать ** что-то **. –
@WeatherVane: Этот стандарт не требуется. У большинства ЦП нет такой защиты. – Olaf