Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
#1

Почему этот код работает? - C++

05.05.2013, 00:25. Просмотров 626. Ответов 11
Метки нет (Все метки)

Почему этот код работает без единого предупреждения?
Мы заведомо вылазим за границу массива.
http://www.cyberforum.ru/cpp-beginners/thread712250.html
Известно что если размерность массива n, то последний элемент в нем n-1й. Но при этом в программе даже n+100й элемент воспринимается нормально как ни в чем не бывало. Что такое?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main (void)
{
    const int n = 5;
    int mas[n];
    mas[n+100] = 4;
    cout << mas[n+100] << endl;
    system ("pause");
}

если компилировать в Dev то зависает с ошибкой, а VS2010 спокойно компилирует и выводит результат
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2013, 00:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему этот код работает? (C++):

Почему не работает этот кусок программы?
Дана цепочка 00000101001010 она записана в массив, каждая цифра отдельный...

Объяснить почему компилируется этот код (динамические массивы)
Что это =-O int*array = new int; То есть почему компилится? anti-k, ...

Как этот код работает?
#include &lt;iostream&gt; using namespace std; int main () { char ch = 0;...

Не могу понять как работает этот код в деталях
dg1-&gt;Rows-&gt;Clear();//Очищяет в датагриде строки ifstream infile...

Почему не работает код на других компьютерах (на моем работает)?
вот задание: построить ф-ю: на вход поступают 2 строки, на выходе 1 строка, по...

11
metaluga145
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 00:30 #2
gorus95, потому,что за Вами никто не следит,что вы делаете, пока не начнете мешать системе. Если Вы просто читаете, то это никак ей не мешаете, если же попробуете писать, то Вам скажет "ая-я-яй"
0
Simpson_
16 / 16 / 3
Регистрация: 06.02.2013
Сообщений: 57
05.05.2013, 00:31 #3
хм, в Visual Studio с какого-то перепугу компилирует, а в C++ Builder 6 нет.
тоже интересно как-так.
0
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
05.05.2013, 00:34  [ТС] #4
metaluga145, так мы и пробуем записать
C++
1
mas[n+100] = 4;
а VS говорит что все нормально, и при этом даже куда-то записывает, и потом даже откуда-то считывает
0
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
05.05.2013, 00:35 #5
gorus95, Си не контролирует выход запределы массива.Если будете читать область памяти, то всё норм.Но если вы захотите записать что либо за пределы массива, то скорее всего выскочит ошибка и там будет что то вроде "Запись в защищенную область памяти"
0
metaluga145
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 00:37 #6
gorus95, я Вам советую это запустить код раз 100 подряд и посмотреть что будет.
Если честно, то раз на раз не приходится. Если Вы попадаете на занятую память, то тогда программу сразу выбросит
0
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
05.05.2013, 00:41  [ТС] #7
metaluga145, да действительно. приблизительно на 6 раз выдает ошибку. но в Dev всегда ошибка
0
metaluga145
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 00:50 #8
gorus95, значит VS рассчитана на более опытных программистов.
0
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,907
Записей в блоге: 3
Завершенные тесты: 1
05.05.2013, 03:22 #9
Цитата Сообщение от gorus95 Посмотреть сообщение
а VS2010 спокойно компилирует и выводит результат
Пройдитесь в пошаговом режиме думаю, это натолкнет Вас на мысль
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
05.05.2013, 10:31 #10
Цитата Сообщение от gorus95 Посмотреть сообщение
Почему этот код работает без единого предупреждения?
Visual Studio 2010 SP1.
При компиляции данного кода возникает предупреждение:
Warning C4789: destination of memory copy is too small.

Цитата Сообщение от gorus95 Посмотреть сообщение
Мы заведомо вылазим за границу массива.
Известно что если размерность массива n, то последний элемент в нем n-1й. Но при этом в программе даже n+100й элемент воспринимается нормально как ни в чем не бывало. Что такое?
Компилятор не знает наших намерений.
Может быть, выход за пределы массива является задумкой программиста и преследует
какую-то оправданную цель. Поэтому компилятор предупреждает, но не вмешивается.
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 51
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
05.05.2013, 12:08 #11
Это от компилятора зависит
0
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
05.05.2013, 12:46  [ТС] #12
понятно, спасибо всем
0
05.05.2013, 12:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2013, 12:46
Привет! Вот еще темы с решениями:

Почему код не работает?
#include &lt;iostream&gt; using namespace std; unsigned long double*...

Почему не работает код?
можете подсказать почему мой код не работает правильно ??? задача вот в чем...

Почему не работает код?
подскажите пожалуйста почему мой код не работает. от меня требуется...

Почему код не работает?
#include &lt;ctime&gt; #include &quot;std_lib_facilities.h&quot; int main() { vector...


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

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

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