2015-11-21 3 views
0

У меня есть массив чисел, как:Предотвращение массива записи на несуществующий индекс

int a[10]={1,1,1,1,1,1,1,1,2,1}; 

Я считаю позицию 2, а затем изменить значение IndexOf (2) +4 и -4 до 2 тоже.

Проблема в том, что indexof (2) +4 не существует, что означает, что c перезапишет некоторую память, которая не принадлежит массиву. Как я могу остановить c на запись в индексы, которые превышают длину массива?

+6

Проверьте, равен ли результат = = 10. –

+1

Поскольку это C, элементы массива должны быть разделены символом '{}'. Или также '[]' также действительны? – Arc676

+2

У вас нет - как программист, вам нужно убедиться, что любой индекс, к которому вы обращаетесь, действителен. Вы можете использовать библиотеку. Например, в C++ вы можете использовать 'std :: vector' и вызывать метод' at'. – CompuChip

ответ

3

В C нет встроенной проверки (то есть, что происходит без участия программиста), чтобы обеспечить индексирование массива в пределах границ.

Если вы хотите получить доступ (чтение или запись) a[i], то вам нужно написать код проверки, что i является допустимым индексом, прежде чем делать это, и не имеют доступа к a[i] если i является недействительным. Это означает, что значение составляет 0 и n-1, где n известно как количество элементов в массиве.

Существуют различные варианты получения или установки значения n. Каждый из них имеет ограничения на применимость.

1

Оператор sizeof() можно использовать для получения размера массива. Используя его, вы можете проверить, превышает ли значение indexof (2) +4 размер массива перед изменением значения.

+1

Не полагайтесь на 'sizeof' - во многих ситуациях, в частности, через вызовы функций массив распадается на указатель. И тогда 'sizeof' бесполезен. –

+2

Это правда, Оливер, но если массив не «разложился» на указатель, 'sizeof' - это окончательный способ оценить его размер. – Peter

Смежные вопросы