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

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

Войти
Регистрация
Восстановить пароль
 
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 152
Завершенные тесты: 1
#1

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

05.05.2013, 00:25. Просмотров 602. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2013, 00:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему этот код работает? (C++):

Здравствуйте, Почему не работает этот код? - C++
Здравствуйте.Прошу помочь.Почему не работает этот код? std::ifstream input_file(&quot;http://nanshakov.16mb.com/developed/test/hash.txt&quot;); ...

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

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

Как этот код работает? - C++
#include &lt;iostream&gt; using namespace std; int main () { char ch = 0; int count = 0; cout &lt;&lt; &quot;Please enter a sentence:&quot;...

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

Почему не работает код? - C++
можете подсказать почему мой код не работает правильно ??? задача вот в чем Вход программы имеет следующий формат. Сначала...

11
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 00:30 #2
gorus95, потому,что за Вами никто не следит,что вы делаете, пока не начнете мешать системе. Если Вы просто читаете, то это никак ей не мешаете, если же попробуете писать, то Вам скажет "ая-я-яй"
0
Simpson_
15 / 15 / 3
Регистрация: 06.02.2013
Сообщений: 55
05.05.2013, 00:31 #3
хм, в Visual Studio с какого-то перепугу компилирует, а в C++ Builder 6 нет.
тоже интересно как-так.
0
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 152
Завершенные тесты: 1
05.05.2013, 00:34  [ТС] #4
metaluga145, так мы и пробуем записать
C++
1
mas[n+100] = 4;
а VS говорит что все нормально, и при этом даже куда-то записывает, и потом даже откуда-то считывает
0
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
05.05.2013, 00:35 #5
gorus95, Си не контролирует выход запределы массива.Если будете читать область памяти, то всё норм.Но если вы захотите записать что либо за пределы массива, то скорее всего выскочит ошибка и там будет что то вроде "Запись в защищенную область памяти"
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 00:37 #6
gorus95, я Вам советую это запустить код раз 100 подряд и посмотреть что будет.
Если честно, то раз на раз не приходится. Если Вы попадаете на занятую память, то тогда программу сразу выбросит
0
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 152
Завершенные тесты: 1
05.05.2013, 00:41  [ТС] #7
metaluga145, да действительно. приблизительно на 6 раз выдает ошибку. но в Dev всегда ошибка
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 00:50 #8
gorus95, значит VS рассчитана на более опытных программистов.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
05.05.2013, 03:22 #9
Цитата Сообщение от gorus95 Посмотреть сообщение
а VS2010 спокойно компилирует и выводит результат
Пройдитесь в пошаговом режиме думаю, это натолкнет Вас на мысль
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 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 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
05.05.2013, 12:08 #11
Это от компилятора зависит
0
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 152
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

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

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

Почему код не работает? - C++
#include &lt;iostream&gt; using namespace std; unsigned long double* remove(unsigned long double* Arr, size_t* Size) { ...

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


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

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

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