2015-10-24 4 views
0

Что произойдет, если я сделаю что-нибудь подобное?C: Инициализация размера + 1 массива?

int a[10]; 
a[10] = 1; 

Элементы массива идут от 0-9, поэтому я в основном инициализирую целое число вне его размера. Это приведет к ошибке и сделает ту же ошибку, если она есть, применимо также к массиву символов? Я знаю, что вы объявляете [размер + 1] оставить элемент для нулевого значения, но это в значительной степени это ...

EDIT: Это приведет к чему-либо еще, кроме переполнения буфера?

+0

1) Возможно, вы захотите добавить язык, который вы используете, и 2) попробовали ли вы его? – beaker

+0

Извините, я забыл добавить это. Да, я попробовал запустить его, и это не дало мне никаких ошибок, поэтому мне любопытно, не даст ли он мне позже. – Keilara

ответ

1

Поведение не определено и может произойти от «ничего не происходит» над «сплошным крахом через несколько мгновений» до «совершенно странного Heisenbug». Его также вполне вероятно вызвано компиляторами.

Что действительно происходит, так это то, что вы помещаете массив в стек, а затем записываете его под «что-то еще». Это «что-то еще» может сильно различаться и определяться только если вы посмотрите на сгенерированный код сборки.

[Int А [10]] [ предыдущие переменные, возможно, даже обратный адрес]

Короче говоря: не делают, и попробуйте использовать параметры компилятора, которые позволяют проверки и предупреждения стека. Если вам посчастливилось использовать недавний gcc или clang, вы должны получить предупреждение о том, что вы получаете доступ за пределы, и вы также можете включить «дезинфицирующие средства», которые будут предупреждать о таких обращениях, которые происходят, когда ваша программа работает.