Что происходит при назначении значения массиву, если индекс превышает размер массива в C - PullRequest
2 голосов
/ 21 января 2010

Что происходит при назначении значения массиву, если индекс превышает размер массива в C?

В других языках выдает исключение, C также выбрасывает исключение? По какой-то причине я не получаю никаких ошибок

Ответы [ 5 ]

7 голосов
/ 21 января 2010

Что происходит при назначении значения массиву, если индекс превышает размер массива в C?

Плохая вещь случается. Или нет. Фактически, стандарт утверждает, что это неопределенное поведение, что означает, что все может произойти.

На других языках выдает исключение, C также вызывает исключение?

Количество

6 голосов
/ 21 января 2010

Это сильно зависит от программы, компилятора и системы. Обычно в Windows более строгие ограничения на объем памяти, в то время как Linux может дать вам дополнительное пространство, которое может заставить программу работать правильно (даже при наличии проблем).

Если вам повезет, система немедленно выйдет из строя, и вы заметите ошибку, как только она появится. Если вам не повезет, это изменит совершенно неожиданную (но правильную с точки зрения программы) переменную и создаст странные ошибки в совершенно разных частях кода, чем та, которая вызывает проблему. Это, вероятно, худшие ошибки на C ...

В системах Linux отличным инструментом является Valgrind , который будет проверять такого рода проблемы (среди прочих). К сожалению, я не знаю эквивалентного инструмента для Windows ...: - (

C не может генерировать исключения, поэтому ...

3 голосов
/ 21 января 2010

Не определено. Это означает, что вы можете перезаписать другую переменную, если вам не повезло, и ничего не делайте.

На этот вопрос есть несколько хороших ответов, на которые стоит обратить внимание.

C также не имеет исключений, что означает, что он не может их выбросить.

0 голосов
/ 21 января 2010

Поведение не определено; может произойти все что угодно (для разумных значений «что-нибудь»). Может показаться, что ваша программа работает правильно, вы можете повредить некоторую память, что позже вызовет проблемы при выполнении программы, вы можете вызвать нарушение сегментации или что-то еще может произойти. Переполнения буфера - это распространенная уязвимость для вредоносных программ.

0 голосов
/ 21 января 2010

Запись за конец массива означает, что вы пишете в другой бит памяти. Что происходит, зависит от того, что компьютер делает с этой памятью в данный момент.

Если память принадлежит другой программе, вы, вероятно, получите исключение или аварийно завершите работу программы.
Если вы владеете памятью, вы меняете это значение. Может быть, это счетчик циклов, и вы получите бесконечный цикл. Возможно, это адрес на жестком диске, который вы собираетесь записать, и вы очистите файловую систему. Может быть, это игнорируется, и ничего не произойдет.

Итак, ответ на вопрос "что будет?" «почти все, включая« ничто »».

В современном программировании просто нет оправдания переполнению буфера. Не делай этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...