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

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

Войти
Регистрация
Восстановить пароль
 
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
#1

"мёд как бы есть, но его как бы нет" - C++

12.05.2012, 11:38. Просмотров 899. Ответов 4
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
using namespace std;
 
int main()
{
    int array[0];
    for (int i=0; i<5; i++)
    {
        array[i] = i;
        cout << array[i] << endl;
    }
    return 0;
}
Почему этот код работает, ведь он обращается к несуществующему элементу массива?
После благополучного выполнения программы сообщается об ошибке сегментирования (хотя с этого вроде бы должно начинаться). Между тем программа, из которой я это вырезал, не возвращает вообще никакой ошибки.
Как это так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2012, 11:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос "мёд как бы есть, но его как бы нет" (C++):

Дана строка, в котором есть слово "да" или слово "нет". Если в нем есть слово "нет", то удалить его - C++
Дана строка, в котором есть слово &quot;да&quot; или слово &quot;нет&quot;. Если в нем есть слово &quot;нет&quot;, то удалить его или получить строку в слова &quot;да&quot; и...

После каждого знака препинания (".", ",", ";") вставить в строку пробел, если там его нет - C++
Выполните задания с использованием библиотечного класса string. Даны строка S. Необходимо после каждого знака препинания (&quot;.&quot;, &quot;,&quot;,...

Для массива из 10 чисел проверить, есть ли в нем два одинаковых числа и напечатать "да" или "нет" - C++
void check_same(const int* a) { for (const int* p = a; p &lt; a + 9; p++) for (const int* q = p+1; q &lt; a + 10; q++) ...

Как сделать, так чтобы i и j можно было вводить самому "i" И "j" в цикле, есть программа - C++
#include &lt;iostream&gt; using namespace std; int main() {int a=0,b=0; int i=0; cout&lt;&lt;&quot;Vvedite i=&quot;&lt;&lt;endl; cin&gt;&gt;i; ...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Как отключить автоматическое добавление "_" "@" "number" к имени экстернального метода? - C++
Здраствуйте! Подскажите как это делается? (вопрос в названии темы) среда : VS2013 проект компилируется в dll файл в начале...

4
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.05.2012, 11:40 #2
Это называется undefined behavior, что на русский можно перевести как "неопределенное поведение". Это значит, что стандарт не предусматривает результат такой операции, и может произойти что угодно(на разных компиляторах - разное поведение). Например, может пойти дождь.
1
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
12.05.2012, 11:46 #3
запускал в Дебаге???
если да то там для выделения памяти, массивов и стека прописывается область защищенной памяти
и ты пишешь в неё(по крайней мере VS)
если в Релизе то должен бы затерется стек и при выходе программа бы рухнула

Добавлено через 1 минуту
ты точно скопировал код???
может в оригинале была подмена адреса возврата и по сему все работало

Добавлено через 1 минуту
Цитата Сообщение от diagon Посмотреть сообщение
на разных компиляторах - разное поведение
даже на разных платформах
0
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
12.05.2012, 11:50  [ТС] #4
Я точно скопировал код. Запускал в консоли
Bash
1
2
3
4
5
6
7
8
9
# g++ -o3 -o a1 a1.cpp
# ./a1
0
1
2
3
4
ошибка сегментирования
#
Я специально выделил это в отдельный файл, нет ни дебага, ни релиза
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
12.05.2012, 12:02 #5
ну все правильно
затер стек проге некуда вернутся по return ну и рухнули
попробуй пройти в отладчике и посмотреть как меняются переменные
лучше всего дизасемблировать IDA и пройти ее отладчиком увидишь как затрется стек
или напиши так
C++
1
2
3
4
5
6
 for (int i=0; i<5; i++)
    {
        cout << array[i];
        array[i] = i;
        cout << array[i] << endl;
    }
узнаешь что было и стало в памяти

вообще то практического применения сии вопросы не имеют

Добавлено через 4 минуты
Цитата Сообщение от Voroshek Посмотреть сообщение
нет ни дебага, ни релиза
это режимы компиляции Debug(Для отладки)записываются служебные структуры, защитные блоки прочие навороты
Relise(Окончательный) происходит оптимизация выбрасывается все ненужное
Цитата Сообщение от Voroshek Посмотреть сообщение
g++ -o3 -o a1 a1.cpp
в данном компиляторе не силен не могу сказать в каком режиме ты компилил
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2012, 12:02
Привет! Вот еще темы с ответами:

Удалить ту строку в котором есть слово "нет" - C++
Есть строки и нужно удалить ту строку в котором есть слово &quot;нет&quot;. Все остальные должны оставаться без изменений.

Конструктор Шредингера "нет подходящего конструктора по умолчанию", хотя он есть - C++
собственно, код. на 156-й строке ( cont(circi);) ругается на отсутствие конструктора в классе. но он там есть! я его видел! а если...

Составить программу,которая выведет "Да","Нет","на границе" - C++
Вот фотки графика и задание,заранее спасибо

Дана точка на плоскости с координатами (х, у). Составить программу, которая выдает одно из сообщений "Да", "Нет", "На - C++


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
12.05.2012, 12:02
Ответ Создать тему
Опции темы

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