Потому что это *(arth + 1)
вызывает неопределенное поведение!
Неопределенное поведение — это когда программа может действовать неожиданно. В вашем случае это может работать как в первом фрагменте кода, так и во втором. Или сегодня это может вообще не сработать в обоих случаях. Завтра может. На вашей машине это может сработать, на моей... может и нет! Узнайте больше о UB.
Вы обращаетесь к памяти, к которой не должен обращаться ваш указатель.
Когда вы добавляете 1, вам, вероятно, (не)повезло, и вы получаете доступ к памяти, которой ваша программа владеет, таким образом, вы ускользаете от полиции (ОС).
Когда вы добавляете 1000, вы выходите за пределы сегмента программы, вызывая ошибку сегментации или нарушение прав доступа (вы называете это!).
Визуализация:
а>
Вы действуете так, как будто arch
указывает на массив, а когда array[i]
допустимо, array[i + 1]
тоже допустимо (при условии, что i + 1 не больше или равно размеру массива).
Однако arch
просто указывает на одну переменную, ни больше, ни меньше!
C позволяет вам целый день выполнять арифметические операции с указателями, но ответственность за результат лежит на вас. В вашем случае оба приращения действительны с точки зрения синтаксиса и т. д., но вызывают Undefined Behavior, что является логической ошибкой (можно сказать, что это приводит к недопустимой среде выполнения).
person
gsamaras
schedule
05.09.2017