Почему программа выдает ошибку во время выполнения итерации по вектору emtpy в c ++ - PullRequest
5 голосов
/ 13 февраля 2020
vector <int> o;    //Empty vector
for(int i=0;i<=o.size()-1;i++) cout<<o[i]; 

получил ошибку во время выполнения выше

vector <int> o;  
for(auto j : o){
 cout<<j<<" ";
            } 

Однако этот код работает нормально, если вместо

используется итератор

Ответы [ 3 ]

15 голосов
/ 13 февраля 2020

o.size() требуется стандартом C ++ для возврата типа unsigned. Когда это ноль, вычитание 1 дает std::numeric_limits<decltype(o.size())>::max(), что означает, что ваш l oop выходит за границы пустого вектора.

for(std::size_t i = 0; i < o.size(); ++i) - очевидное исправление. Использование <= и -1 кажется мне почти искусственно выдуманным.

6 голосов
/ 13 февраля 2020

o.size() вернет значение без знака, равное 0. Вычитание из него возвращает очень большое положительное число, по существу, равное бесконечному l oop. В конечном итоге ваш доступ к массиву вне пределов o[i] приведет к взлому sh.

. Вы можете использовать

for(int i = 0; i <= int(o.size() - 1); i++)

или просто использовать более типичные

for(int i = 0;i < o.size(); i++)

, где вы проверяете «меньше чем», а не «меньше или равно» номеру на единицу меньше.

2 голосов
/ 13 февраля 2020

Поскольку sizeof(size_t) больше или равно sizeof(int) (хотя это может зависеть от реализации) и size_t равно unsigned, int (1) преобразуется в size_t.

Следовательно, в выражении o.size() - 1 1 неявно преобразуется в size_t, и o.size() - 1 (что эквивалентно size_t(0 - 1)) становится равным std::numeric_limits<size_t>::max(). Следовательно, for l oop вводится, и доступ к вашему пустому o по индексу 0 приводит к неопределенному поведению.

Вы должны:

for (size_t idx = 0; idx < o.size(); ++idx) { /* ... */ }

Если для некоторых Если вам нужен индекс типа int, вы можете:

for (int idx = 0; idx < static_cast<int>(o.size()); ++idx) { /* ... */ }

или в вашем примере (который встречается реже):

for (int idx = 0; idx <= static_cast<int>(o.size()) - 1; ++idx) { /* ... */ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...