Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.79
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
#1

Обращение к элементам вектора - C++

25.07.2011, 23:24. Просмотров 5610. Ответов 17
Метки нет (Все метки)

Вопрос вот в чем. Есть следующий код:
C++
1
2
3
4
5
6
7
8
9
#include <vector>
#include <iostream>
 
int main() {
 
    std::vector<int> a(10, 1);
 
    std::cout << a[2061];
}
MinGw - его прекрасно компилит, и программа работает! Выводит 55328 А по идее должна вылетать. Если же обратится к 2062 элементу - ошибка при выполнении. Собственно, почему это работает??
http://www.cyberforum.ru/cpp-beginners/thread1517926.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2011, 23:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обращение к элементам вектора (C++):

Обращение к элементам матрицы
Всем привет. Вот моё задание: В данной матрице определить произведение...

Обращение к элементам массива в C++
#include &lt;SFML\Graphics.hpp&gt; const int number_units = 1; Sprite Person;...

Обращение к элементам string
Здравствуйте, Подскажите пжлст как обращаться к элементам string в данной...

Обращение к элементам, членам класса
Здравствуйте! Мне нужно выполнить задания из меню (в коде программы), но я не...

Обращение к элементам массива структур
Вводим n-ое количество имен и количество оценок каждому из имен.(студент -...

17
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 23:26 #2
Цитата Сообщение от zuq Посмотреть сообщение
А по идее должна вылетать. Если же обратится к 2062 элементу - ошибка при выполнении.
с чего вы это взяли? доступ к элементу вектора через [] не контролируется
если бы вы написали
C++
1
2
3
4
5
6
7
8
9
#include <vector>
#include <iostream>
 
int main() {
 
    std::vector<int> a(10, 1);
 
    std::cout << a.at(2061);
}
было бы исключение std::out_of_range
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
25.07.2011, 23:27  [ТС] #3
В студии вылетает. Откуда он тогда берет это число?
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 23:30 #4
Цитата Сообщение от zuq Посмотреть сообщение
В студии вылетает. Откуда он тогда берет это число?
это в дебаге, а вы поставте release mode
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
25.07.2011, 23:33  [ТС] #5
В relase можно до 2059
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 23:36 #6
а вы не из VS запустите
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
25.07.2011, 23:43  [ТС] #7
Сейчас нашел в книге, что-то вроде - "стандарт ничего не говорит о том, что может произойти в данном случае". Но все же - странно....
0
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
25.07.2011, 23:45 #8
из под NetBeans (MinGW) что в дебаге, что в релизе выкидывает ексепшн
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 23:49 #9
Цитата Сообщение от zuq Посмотреть сообщение
"стандарт ничего не говорит о том, что может произойти в данном случае"
потому что стандарт не знает что хранится в конкретной ячейке памяти за пределами вектора, undefined behavior
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
25.07.2011, 23:50  [ТС] #10
То есть вы хотите сказать, что результат выполнения будет зависеть от того, что храниться в конкретной ячейке памяти?
0
grizlik78
Эксперт С++
1982 / 1475 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
25.07.2011, 23:59 #11
Результат, в первую очередь, будет зависеть от того, разрешён ли доступ на чтение по данному адресу (это зависит и от ОС и от компилятора). И если вдруг разрешён, тогда уж от того, что там хранится. Но при каждом запуске программы там могут храниться разные данные.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 23:59 #12
deleted
0
grizlik78
Эксперт С++
1982 / 1475 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
25.07.2011, 23:59 #13
Но такое использование — это явная ошибка.
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
26.07.2011, 00:02  [ТС] #14
Понятно, что это ошибка От этого нас может защитить функция at()
0
grizlik78
Эксперт С++
1982 / 1475 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
26.07.2011, 00:04 #15
Может. Но лично я предпочитаю защищаться функцией assert. В рабочем коде, как правило, лишние проверки не нужны. А .at() там, где живучесть программы прежде всего.
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
26.07.2011, 00:07  [ТС] #16
Что-то я не понял, что делает функция assert..
0
grizlik78
Эксперт С++
1982 / 1475 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
26.07.2011, 00:13 #17
В release версии ничего. Она вообще выкидывается из программы (строго говоря это макрос).
А в debug версии если аргумент равен нулю (ложь) то программа завершается с выводом номера строки и выражения (то есть аргумента assert)
0
Roof
154 / 154 / 44
Регистрация: 03.11.2010
Сообщений: 393
26.07.2011, 00:53 #18
2 zuq
для доступа к элементам вектора можно использовать итераторы, с проверкой не указывает ли итератор на end(). Этот подход - так называемая идиома STL в использовании контейнеров ( взято из одного из изданий книги Стенли Липпмана ) .
В случае обращения к несуществующему элементу вектора - предсказать результат нельзя заранее.
Вот цитата из книги Стенли Липпман "Язык программирования C++ вводный курс" 4 изд. стр. 119:
Очень важно понять, что оператор индексирования ( [] ) можно использовать для доступа только к фактически существующим элементам.
...
...
Попытка обращения во время выполнения программы к несуществующему элементу является серьезной ошибкой. Подобно большинству подобных ошибок, практически ни одна из реализаций компилятора не обнаруживает их. Результат выполнения такой программы непредсказуем, однако почти наверняка такая программа правильно работать не будет.
...
...
Попытка индексирования несуществующих элементов, к сожалению, является весьма распространенной и грубой ошибкой программирования. Так называемая ошибка переполнения буфера ( buffer overflow ) - результат индексирования несуществующих элементов. Такие ошибки являются наиболее распространенной причиной проблем защиты приложений.
0
26.07.2011, 00:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2011, 00:53
Привет! Вот еще темы с решениями:

Обращение к определенным элементам vector'а
Всем привет! Появилось потребность в библиотеке vector. Подскажите, как...

Сортировка эл-ов списка, обращение к элементам
Здравствуйте, мне нужно отсортировать список по алфавиту. Я могу сделать это,...

Обращение к элементам класса через []
Пишу класс для работы с комплексными числами, почти все готово, осталось только...

Обращение по адресу к элементам структуры
Есть структура fs: struct fs { f_element; s_element; ......


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru