2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
|
||||||
1 | ||||||
Почему массив не переполняется?02.02.2011, 06:52. Показов 1785. Ответов 22
Метки нет (Все метки)
Вот в одной книге есть задание создать вектор и скопировать элементы в массив. Почему массив не переполняется в следующем коде, какая-то загадка для меня. Вроде бы после введения 2-3 элементов он не должен больше принимать, а он принимает, и только после введения 6 элементов программа завершается с ошибкой, а 5 спокойно запоминает, ладно бы вектор, а тут массив, вроде бы с определенным размером:
0
|
02.02.2011, 06:52 | |
Ответы с готовыми решениями:
22
не переполняется динамический массив Переполняется стек Почему возможно задать массив с размером -1 (почему такое вообще компилируется)? Почему переполняется стек |
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
02.02.2011, 06:59 | 2 |
AdPotam, Все очень просто, С не контролирует размер массивов и ты можешь спокойно пихать данные за его пределы, и затереть соседние данные. А ошибка возникнет только тогда, когда программа начнет эти соседние данные использовать )
1
|
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
|
|
02.02.2011, 08:04 [ТС] | 3 |
Но почему тогда только при введении именно 6-и символов программа вылетает? Вот что заставило меня подумать, что в этом есть какая-то закономерность. А не, допустим, 4 или 9-и? Я изучаю С++, возможно, этот язык контролирует размер массивов? Вот что об этом пишется в книге, по которой учусь:
0
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
02.02.2011, 08:13 | 4 |
Тут еще зависит от того в релизе ты проверял или под дебагером?
Эта величина не совсем случайна, есть определенные закономерности в выделении памяти программы.
0
|
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
|
|
02.02.2011, 08:20 [ТС] | 5 |
Компилил, как тут мне посоветовали, GCC, а писал в блокноте Кажется, это релиз, а функций дебагера у него нет, только на ошибки указывает. Словом, насколько я понял, тут не всё просто, и лучше не заморачиваться, а чтобы исключить неожиданности, лучше за пределы массива не выходить. Так?
0
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
02.02.2011, 08:31 | 6 |
AdPotam, Это само собой, чем кончится выход за границы никто не знает, поразному бывает, программа может работать но глючить в разных местах из за такого.
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
02.02.2011, 09:38 | 7 |
Это не обычный массив С с парой-тройкой функций. Независимо от того, какой размер был задан в конструкторе, при необходимости он может быть увеличен. Короче, так Вы переполнения "массива" вряд ли добьётесь. Разве, что всю доступную память израсходуете.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
02.02.2011, 09:51 | 8 |
easybudda, эмм... Полагаю, вопрос был про переполнение массива ar1, который является обычным Си-массивом из двух элементов.
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
02.02.2011, 10:17 | 9 |
Точно, не разглядел. Тогда всё проще. Элементы будут помещаться в массив, пока стек не кончится.
Если в стеке после массива есть ещё что-то - оно затрётся.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
02.02.2011, 10:21 | 10 |
easybudda, ты хоть код читал? Он выходит за пределы совсем другого массива.
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
02.02.2011, 11:07 | 11 |
мало того - скомпилировал и выполнил. А ты?
Код
C:\cpp\shitcode>out2 1 2 3 4 5 ^Z 11 22 33 44 55
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
02.02.2011, 11:10 | 12 |
Компиляция здесь причём? Компил его совсем не так читает. Или ты его вручную компилил и в голове выполнял? Надо было не компилить копипасту, а внимательно читать, тогда бы ты знал, в какую сторону выполняется присваивание и что должно переполняться.
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
02.02.2011, 13:09 | 13 |
Юмор?
Про то, "в какую сторону выполняется присваивание", наверное между строк читать нужно было? Имя массива int ar1[2] суть - адрес куска памяти, находящегося в стеке, достаточного, или большего, чем требуется для размещения двух значений типа int. Пока индекс за границу этого куска не выходит, всё как буд-то работает.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
02.02.2011, 13:11 | 14 |
Ну я то об этом знаю. И ещё про отсутствие контроля этого самого индекса. А вот ты операнды явно попутал.
0
|
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
|
||||||
02.02.2011, 13:37 [ТС] | 15 | |||||
Понятно, спасибо всем ответившим! Есть легкое удивление, почему это разработчики языка С не додумались жестко ограничить размеры массива, а не провоцировать ситуации, когда возможны всякие ошибки. Ну да ладно, и на том, как говорится, спасибо.
Добавлено через 4 минуты
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
02.02.2011, 13:41 | 16 |
Нюанс в том, что они оба массивы. Только один из (вектор) саморасширяемый, а другой обычный.
Добавлено через 2 минуты Ошибки провоцируются мифом о защите от ошибок. Вот в делфях защита якобы есть, так я несколько раз получал такие глюки при обработке элементов за пределами массива! И ни разу защита не сработала. А на сях сам думаешь о границах массива и о соседних данных и ошибки исключены.
1
|
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
|
|
02.02.2011, 13:46 [ТС] | 17 |
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
02.02.2011, 14:02 | 18 | |||||
Вектор. Но понятие массива многозначно.
Добавлено через 6 минут Мало того, вектора тоже бывают разные.
1
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
02.02.2011, 16:07 | 19 |
Ну ответ очевиден - это сделано для скорости. В контейнерах std::vector, std::deque и std::string тоже при указании индекса в квадратных скобках его правильность не проверяется, и если он вышел за пределы, то поведение программы неопределенное. Для получения элемента этих контейнеров по индексу с его проверкой используется функция-член at (которая, естественно, работает медленнее). В случае выхода индекса за пределы она генерирует исключение out_of_range.
0
|
2 / 2 / 0
Регистрация: 29.11.2010
Сообщений: 73
|
|
02.02.2011, 16:20 [ТС] | 20 |
Всё понял, век живи = век учись
0
|
02.02.2011, 16:20 | |
02.02.2011, 16:20 | |
Помогаю со студенческими работами здесь
20
Почему не загружается картинка, но при этом переполняется память? Стек переполняется и переполняется... Память переполняется Переполняется папка TEMP Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |