Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
AdPotam
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
#1

Почему массив не переполняется? - C++

02.02.2011, 06:52. Просмотров 1130. Ответов 22
Метки нет (Все метки)

Вот в одной книге есть задание создать вектор и скопировать элементы в массив. Почему массив не переполняется в следующем коде, какая-то загадка для меня. Вроде бы после введения 2-3 элементов он не должен больше принимать, а он принимает, и только после введения 6 элементов программа завершается с ошибкой, а 5 спокойно запоминает, ладно бы вектор, а тут массив, вроде бы с определенным размером:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
int i = 0;
     int ar1[2];
     vector <int> ivec (0);
           while (cin >> i) 
      ivec.push_back(i);
                  for (vector<int>::size_type j = 0; j != ivec.size(); ++j) {
           ar1[j] = ivec[j];
           cout << ivec[j] << ar1[j] << endl;
            }
     getch();
     return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2011, 06:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему массив не переполняется? (C++):

не переполняется динамический массив - C++
Заметил странную штуку: при заполнении динамического массива в цикле, когда счётчик становится больше размера массива не происходит ошибки,...

Переполняется стек - C++
Вот код: #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;algorithm&gt; using namespace std; const string inputFileName =...

Почему возможно задать массив с размером -1 (почему такое вообще компилируется)? - C++
Всем привет. Долгое время не писал на плюсах, решил пройтись по основам, вспомнить. По непонятным для меня причинам этот код...

Почему массив не присвоился в другой массив? - C++
#pragma hdstop #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #define eof 26 #define max 1000 getline(char s, int lim) { int i,c; ...

Почему не сортируется массив? - C++
using namespace std; void scan(int * mass) { for( int i = 0; i &lt; 10; i++) { cin &gt;&gt; mass ; } } void print ( int * mass...

Почему не сортируется массив? - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;Rus&quot;); ...

22
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.02.2011, 13:41 #16
Нюанс в том, что они оба массивы. Только один из (вектор) саморасширяемый, а другой обычный.

Добавлено через 2 минуты
Цитата Сообщение от AdPotam Посмотреть сообщение
а не провоцировать ситуации, когда возможны всякие ошибки.
Ошибки провоцируются мифом о защите от ошибок. Вот в делфях защита якобы есть, так я несколько раз получал такие глюки при обработке элементов за пределами массива! И ни разу защита не сработала. А на сях сам думаешь о границах массива и о соседних данных и ошибки исключены.
1
AdPotam
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
02.02.2011, 13:46  [ТС] #17
taras atavin: Массивы с обеих сторон.
В книге, по которой я учусь, массывы существенно различаются от векторов, а ivec, насколько я понимаю, вектор.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.02.2011, 14:02 #18
Вектор. Но понятие массива многозначно.
Массивом называется составное данное, состоящее и из элементов, каждый из которых адресуется уникальным в пределах массива индексом, или набором индексов
. Отсюда вектор - вид массива.
Статическим массивом называется массив у которого число элементов - константа, но сами элементы - переменные.
К вектору это не относится. Но есть и другие массивы:
ограниченным массивом называется массив, при обращении к несуществующему элементу которого срабатывает защита доступа.
,
динамическим массивом называется массив, у которого могут меняться не только сами элементы, но и их количество.
,
константным массивом называется массив, у которого не только количество элементов - константа, но и сами элементы тоже константы.
. Отсюда вектор - динамический, но не ограниченный массив. Но лучше чтоб не провоцировать путаницу вектор массивом не называть.

Добавлено через 6 минут
Мало того, вектора тоже бывают разные.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class TVector
{
 public:
  double x,y,z;
  TVector ();
  TVector (TVector &x);
  TVector operator = (TVector &x);
  TVector operator + (TVector &x);
  TVector operator - (TVector &x);
  TVector operator * (TVector &x);
  TVector operator * (double x);
  TVector operator / (double x);
  void operator += (TVector &x);
  void operator -= (TVector &x);
  void operator *= (TVector &x);
  void operator *= (double x);
  void operator /= (double x);
  friend TVector operator * (double x, TVector &y);
  friend double abs(TVector &x);
};
тоже вектор.
1
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
02.02.2011, 16:07 #19
Цитата Сообщение от AdPotam Посмотреть сообщение
Есть легкое удивление, почему это разработчики языка С не додумались жестко ограничить размеры массива, а не провоцировать ситуации, когда возможны всякие ошибки.
Ну ответ очевиден - это сделано для скорости. В контейнерах std::vector, std::deque и std::string тоже при указании индекса в квадратных скобках его правильность не проверяется, и если он вышел за пределы, то поведение программы неопределенное. Для получения элемента этих контейнеров по индексу с его проверкой используется функция-член at (которая, естественно, работает медленнее). В случае выхода индекса за пределы она генерирует исключение out_of_range.
0
AdPotam
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
02.02.2011, 16:20  [ТС] #20
Всё понял, век живи = век учись
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.02.2011, 16:38 #21
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну ответ очевиден - это сделано для скорости. В контейнерах std::vector, std::deque и std::string тоже при указании индекса в квадратных скобках его правильность не проверяется, и если он вышел за пределы, то поведение программы неопределенное. Для получения элемента этих контейнеров по индексу с его проверкой используется функция-член at (которая, естественно, работает медленнее). В случае выхода индекса за пределы она генерирует исключение out_of_range.
Так значит ограниченный?
0
Jupiter
Каратель
Эксперт С++
6560 / 3981 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.02.2011, 18:20 #22
Цитата Сообщение от taras atavin Посмотреть сообщение
Так значит ограниченный?
нет, только проверка на попадание в пределы через
Цитата Сообщение от Mr.X Посмотреть сообщение
функция-член at
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.02.2011, 07:10 #23
Цитата Сообщение от AdPotam
Есть легкое удивление, почему это разработчики языка С не додумались жестко ограничить размеры массива, а не провоцировать ситуации, когда возможны всякие ошибки.
код, получаемый после компиляции, должен быть максимально приближен к тому, что было написано
0
03.02.2011, 07:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2011, 07:10
Привет! Вот еще темы с ответами:

Почему не сортируется массив? - C++
Доброго времени суток уважаемые Форумчане,нужно отсортировать в порядке возрастания каждую строку матрицы, код написан, но не сортирует...

Не сдвигается массив. Почему? - C++
ОЪясните пожалйста в чем моя ошибка..((( #include&lt;iostream&gt; #include&lt;ctime&gt; using namespace std; void main() { ...

Почему не заносит в массив? - C++
for(int i=0;i&lt;N;++i) { for(int j=0;j&lt;N;++j) { if (k=rand() % 4 == 1) map==WALL; else map==-1; ...

Массив не сохраняется, почему ? - C++
Вот код. #include &lt;stdio.h&gt; #include &lt;regex.h&gt; #include &lt;ctype.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include...


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

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

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