Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 173
1

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

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

Почему этот код работает без единого предупреждения?
Мы заведомо вылазим за границу массива.
Известно что если размерность массива 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2013, 00:25
Ответы с готовыми решениями:

Здравствуйте, Почему не работает этот код?
Здравствуйте.Прошу помочь.Почему не работает этот код? std::ifstream...

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

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

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

11
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 00:30 2
gorus95, потому,что за Вами никто не следит,что вы делаете, пока не начнете мешать системе. Если Вы просто читаете, то это никак ей не мешаете, если же попробуете писать, то Вам скажет "ая-я-яй"
0
16 / 16 / 3
Регистрация: 06.02.2013
Сообщений: 57
05.05.2013, 00:31 3
хм, в Visual Studio с какого-то перепугу компилирует, а в C++ Builder 6 нет.
тоже интересно как-так.
0
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 173
05.05.2013, 00:34  [ТС] 4
metaluga145, так мы и пробуем записать
C++
1
mas[n+100] = 4;
а VS говорит что все нормально, и при этом даже куда-то записывает, и потом даже откуда-то считывает
0
Мой лучший друг-отладчик!
165 / 165 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
05.05.2013, 00:35 5
gorus95, Си не контролирует выход запределы массива.Если будете читать область памяти, то всё норм.Но если вы захотите записать что либо за пределы массива, то скорее всего выскочит ошибка и там будет что то вроде "Запись в защищенную область памяти"
0
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 00:37 6
gorus95, я Вам советую это запустить код раз 100 подряд и посмотреть что будет.
Если честно, то раз на раз не приходится. Если Вы попадаете на занятую память, то тогда программу сразу выбросит
0
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 173
05.05.2013, 00:41  [ТС] 7
metaluga145, да действительно. приблизительно на 6 раз выдает ошибку. но в Dev всегда ошибка
0
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 00:50 8
gorus95, значит VS рассчитана на более опытных программистов.
0
Грамотный. Безпорно.
16622 / 9662 / 1863
Регистрация: 27.09.2012
Сообщений: 23,968
Записей в блоге: 2
05.05.2013, 03:22 9
Цитата Сообщение от gorus95 Посмотреть сообщение
а VS2010 спокойно компилирует и выводит результат
Пройдитесь в пошаговом режиме думаю, это натолкнет Вас на мысль
0
Ушел с форума
Эксперт С++
16308 / 7376 / 1184
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 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
CEO SOVAZ Corp.
384 / 230 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
05.05.2013, 12:08 11
Это от компилятора зависит
0
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 173
05.05.2013, 12:46  [ТС] 12
понятно, спасибо всем
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2013, 12:46

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Объясните, как работает этот код
Объясните, пожалуйста, как работает этот код, желательно построчно Какие строчки нужно пояснить...

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

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

Почему не работает код?
Может кто найдёт ошибку: #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;time.h&gt; #include...

Почему не работает код?
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; #include &lt;iostream&gt; using namespace std;...

почему код не работает?
помогите пожалуйста, почему у меня код не работает? Ввожу &quot;х&quot;, потом погрешность, а arth всегда...


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

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

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