Даже если это выглядит так, accounts[150]
на самом деле не существует.
Так почему же ваша программа продолжает работать?Ну, это потому, что, хотя accounts[150]
не является реальным элементом, он лежит в области памяти, к которой ваша программа имеет доступ.
C не содержит проверки индексов во время выполнения - он просто вычисляет соответствующий адрес идоступ к этому.Если ваша программа не имеет доступа к этому адресу памяти, она завершится с ошибкой сегментации (или, в терминах Windows, с нарушением доступа).Если, с другой стороны, программе разрешено иметь доступ к этому адресу памяти, то она просто будет обрабатывать все, что находится по этому адресу, как account
.
Если вы попытаетесьизмените это, может произойти почти все - в зависимости от широкого спектра факторов, это может изменить некоторые другие переменные в вашей программе, или, учитывая некоторые очень неудачные обстоятельства, это может даже изменить сам программный код, что может привести ко всемповедение (в том числе аварии).Даже возможно, что никаких побочных эффектов не наблюдалось бы, если бы malloc (по какой-либо причине) выделил больше памяти, чем вы явно просили (что возможно).
Если вы хотите убедиться, что такие ошибки обнаруживаются приво время выполнения вам нужно будет выполнить собственную проверку и обработку ошибок.