Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
AdPotam
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
02.02.2011, 06:52     Почему массив не переполняется? #1
Вот в одной книге есть задание создать вектор и скопировать элементы в массив. Почему массив не переполняется в следующем коде, какая-то загадка для меня. Вроде бы после введения 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2011, 06:52     Почему массив не переполняется?
Посмотрите здесь:

C++ Массив не сохраняется, почему ?
C++ Почему массив инициализируется с 7-ю элементами?..
Почему не заносит в массив? C++
C++ Почему не сортируется массив?
C++ Почему не сортируется массив?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
02.02.2011, 06:59     Почему массив не переполняется? #2
AdPotam, Все очень просто, С не контролирует размер массивов и ты можешь спокойно пихать данные за его пределы, и затереть соседние данные. А ошибка возникнет только тогда, когда программа начнет эти соседние данные использовать )
AdPotam
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
02.02.2011, 08:04  [ТС]     Почему массив не переполняется? #3
Но почему тогда только при введении именно 6-и символов программа вылетает? Вот что заставило меня подумать, что в этом есть какая-то закономерность. А не, допустим, 4 или 9-и? Я изучаю С++, возможно, этот язык контролирует размер массивов? Вот что об этом пишется в книге, по которой учусь:
Переменная типа массива имеет три важных ограничения: она имеет фиксированный размер, этот размер должен быть известен на момент компиляции, и наконец, массив существует только до конца блока, в котором он был определен.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
02.02.2011, 08:13     Почему массив не переполняется? #4
Тут еще зависит от того в релизе ты проверял или под дебагером?
Эта величина не совсем случайна, есть определенные закономерности в выделении памяти программы.
AdPotam
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
02.02.2011, 08:20  [ТС]     Почему массив не переполняется? #5
Компилил, как тут мне посоветовали, GCC, а писал в блокноте Кажется, это релиз, а функций дебагера у него нет, только на ошибки указывает. Словом, насколько я понял, тут не всё просто, и лучше не заморачиваться, а чтобы исключить неожиданности, лучше за пределы массива не выходить. Так?
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
02.02.2011, 08:31     Почему массив не переполняется? #6
AdPotam, Это само собой, чем кончится выход за границы никто не знает, поразному бывает, программа может работать но глючить в разных местах из за такого.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.02.2011, 09:38     Почему массив не переполняется? #7
Цитата Сообщение от AdPotam Посмотреть сообщение
vector <int> ivec (0);
Это не обычный массив С с парой-тройкой функций. Независимо от того, какой размер был задан в конструкторе, при необходимости он может быть увеличен. Короче, так Вы переполнения "массива" вряд ли добьётесь. Разве, что всю доступную память израсходуете.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.02.2011, 09:51     Почему массив не переполняется? #8
easybudda, эмм... Полагаю, вопрос был про переполнение массива ar1, который является обычным Си-массивом из двух элементов.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.02.2011, 10:17     Почему массив не переполняется? #9
Цитата Сообщение от silent_1991 Посмотреть сообщение
Полагаю, вопрос был про переполнение массива ar1
Точно, не разглядел. Тогда всё проще. Элементы будут помещаться в массив, пока стек не кончится.
Если в стеке после массива есть ещё что-то - оно затрётся.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.02.2011, 10:21     Почему массив не переполняется? #10
easybudda, ты хоть код читал? Он выходит за пределы совсем другого массива.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.02.2011, 11:07     Почему массив не переполняется? #11
Цитата Сообщение от taras atavin Посмотреть сообщение
ты хоть код читал?
мало того - скомпилировал и выполнил. А ты?
Код
C:\cpp\shitcode>out2
1
2
3
4
5
^Z
11
22
33
44
55
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.02.2011, 11:10     Почему массив не переполняется? #12
Компиляция здесь причём? Компил его совсем не так читает. Или ты его вручную компилил и в голове выполнял? Надо было не компилить копипасту, а внимательно читать, тогда бы ты знал, в какую сторону выполняется присваивание и что должно переполняться.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.02.2011, 13:09     Почему массив не переполняется? #13
Цитата Сообщение от taras atavin Посмотреть сообщение
Или ты его вручную компилил и в голове выполнял?
Юмор?
Цитата Сообщение от taras atavin Посмотреть сообщение
внимательно читать, тогда бы ты знал, в какую сторону выполняется присваивание и что должно переполняться.
Про то, "в какую сторону выполняется присваивание", наверное между строк читать нужно было?
Имя массива int ar1[2] суть - адрес куска памяти, находящегося в стеке, достаточного, или большего, чем требуется для размещения двух значений типа int. Пока индекс за границу этого куска не выходит, всё как буд-то работает.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.02.2011, 13:11     Почему массив не переполняется? #14
Цитата Сообщение от easybudda Посмотреть сообщение
Имя массива int ar1[2] суть - адрес куска памяти, находящегося в стеке, достаточного, или большего, чем требуется для размещения двух значений типа int.
Ну я то об этом знаю. И ещё про отсутствие контроля этого самого индекса. А вот ты операнды явно попутал.
AdPotam
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
02.02.2011, 13:37  [ТС]     Почему массив не переполняется? #15
Понятно, спасибо всем ответившим! Есть легкое удивление, почему это разработчики языка С не додумались жестко ограничить размеры массива, а не провоцировать ситуации, когда возможны всякие ошибки. Ну да ладно, и на том, как говорится, спасибо.

Добавлено через 4 минуты
easybudda, Про то, "в какую сторону выполняется присваивание", наверное между строк читать нужно было?
Мне, даже начинающему, как будто бы понятно, куда выполняется присваивание - массиву:
C++
1
ar1[j] = ivec[j]
Или тут есть нюансы?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.02.2011, 13:41     Почему массив не переполняется? #16
Нюанс в том, что они оба массивы. Только один из (вектор) саморасширяемый, а другой обычный.

Добавлено через 2 минуты
Цитата Сообщение от AdPotam Посмотреть сообщение
а не провоцировать ситуации, когда возможны всякие ошибки.
Ошибки провоцируются мифом о защите от ошибок. Вот в делфях защита якобы есть, так я несколько раз получал такие глюки при обработке элементов за пределами массива! И ни разу защита не сработала. А на сях сам думаешь о границах массива и о соседних данных и ошибки исключены.
AdPotam
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
02.02.2011, 13:46  [ТС]     Почему массив не переполняется? #17
taras atavin: Массивы с обеих сторон.
В книге, по которой я учусь, массывы существенно различаются от векторов, а ivec, насколько я понимаю, вектор.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 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);
};
тоже вектор.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,658
02.02.2011, 16:07     Почему массив не переполняется? #19
Цитата Сообщение от AdPotam Посмотреть сообщение
Есть легкое удивление, почему это разработчики языка С не додумались жестко ограничить размеры массива, а не провоцировать ситуации, когда возможны всякие ошибки.
Ну ответ очевиден - это сделано для скорости. В контейнерах std::vector, std::deque и std::string тоже при указании индекса в квадратных скобках его правильность не проверяется, и если он вышел за пределы, то поведение программы неопределенное. Для получения элемента этих контейнеров по индексу с его проверкой используется функция-член at (которая, естественно, работает медленнее). В случае выхода индекса за пределы она генерирует исключение out_of_range.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2011, 16:20     Почему массив не переполняется?
Еще ссылки по теме:

C++ Почему не сортируется массив?
Переполняется стек C++
Не сдвигается массив. Почему? C++

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

Или воспользуйтесь поиском по форуму:
AdPotam
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
02.02.2011, 16:20  [ТС]     Почему массив не переполняется? #20
Всё понял, век живи = век учись
Yandex
Объявления
02.02.2011, 16:20     Почему массив не переполняется?
Ответ Создать тему
Опции темы

Текущее время: 20:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru