Segfault не является предполагаемым действием вашей программы на C, которое сообщит вам, что индекс находится за пределами допустимого. Скорее, это непреднамеренное следствие неопределенного поведения.
В C и C ++, если вы объявляете массив как
type name[size];
Вам разрешен доступ только к элементам с индексами от 0
до size-1
. Все, что находится за пределами этого диапазона, вызывает неопределенное поведение. Если индекс был близок к диапазону, скорее всего, вы читаете память своей собственной программы. Если индекс был в значительной степени вне диапазона, скорее всего, ваша программа будет убита операционной системой. Но ты не можешь знать, все может случиться.
Почему C это позволяет? Ну, основной смысл C и C ++ состоит в том, чтобы не предоставлять функции, если они стоят производительности. C и C ++ издавна использовались для систем с высокой производительностью. C использовался в качестве языка реализации для ядер и программ, где доступ вне границ массива может быть полезен для получения быстрого доступа к объектам, расположенным рядом в памяти. Если компилятор запретит, это будет просто так.
Почему это не предупреждает об этом? Ну, вы можете поставить высокий уровень предупреждения и надеяться на милость компилятора. Это называется качество реализации (QoI). Если какой-то компилятор использует открытое поведение (например, неопределенное поведение) для выполнения чего-то хорошего, он имеет хорошее качество реализации в этом отношении.
[js@HOST2 cpp]$ gcc -Wall -O2 main.c
main.c: In function 'main':
main.c:3: warning: array subscript is above array bounds
[js@HOST2 cpp]$
Если бы вместо этого он отформатировал ваш жесткий диск, увидев доступ к массиву вне границ - что было бы допустимо для него - качество реализации было бы довольно плохим. Мне нравилось читать об этом в документе Обоснование ANSI C .