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

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

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

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

12.05.2012, 11:38. Просмотров 866. Ответов 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;
}
Почему этот код работает, ведь он обращается к несуществующему элементу массива?
После благополучного выполнения программы сообщается об ошибке сегментирования (хотя с этого вроде бы должно начинаться). Между тем программа, из которой я это вырезал, не возвращает вообще никакой ошибки.
Как это так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2012, 11:38     "мёд как бы есть, но его как бы нет"
Посмотрите здесь:
C++ Дана строка, в котором есть слово "да" или слово "нет". Если в нем есть слово "нет", то удалить его
Удалить ту строку в котором есть слово "нет" C++
C++ Конструктор Шредингера "нет подходящего конструктора по умолчанию", хотя он есть
C++ Есть массив Т [5], каждый элемент которого имеет тип "Структура Телефон". Ввести его с клавиатуры
C++ Даны две строки. Если они начинаются с одинаковых символов, то напечатать "ДА", иначе - "НЕТ"
OpenCV C++ vs2010 error C2446: :: нет преобразования "const char *" в "_TCHAR *" C++
C++ Как сделать "Старт", "Пауза", Стоп"?
C++ Подскажите как перегрузить операторы ">>", "<<" и "="
C++ Как принять код клавиши, а вписать саму клавишу? (Принимает "57", что означает "9")
C++ Как сделать так, чтобы scanf в переменную double мог считывать с клавиатуры не только "0,01", но и "0.01"
Как сделать так, чтобы введенное с клавиатуры слово "helllo" в памяти сохранялось в виде "Hello". C++
Со слова процессор путем "вырезок" и "склеек" его букв получить слово рессор C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.05.2012, 11:40     "мёд как бы есть, но его как бы нет" #2
Это называется undefined behavior, что на русский можно перевести как "неопределенное поведение". Это значит, что стандарт не предусматривает результат такой операции, и может произойти что угодно(на разных компиляторах - разное поведение). Например, может пойти дождь.
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
12.05.2012, 11:46     "мёд как бы есть, но его как бы нет" #3
запускал в Дебаге???
если да то там для выделения памяти, массивов и стека прописывается область защищенной памяти
и ты пишешь в неё(по крайней мере VS)
если в Релизе то должен бы затерется стек и при выходе программа бы рухнула

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

Добавлено через 1 минуту
Цитата Сообщение от diagon Посмотреть сообщение
на разных компиляторах - разное поведение
даже на разных платформах
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
ошибка сегментирования
#
Я специально выделил это в отдельный файл, нет ни дебага, ни релиза
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
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
в данном компиляторе не силен не могу сказать в каком режиме ты компилил
Yandex
Объявления
12.05.2012, 12:02     "мёд как бы есть, но его как бы нет"
Ответ Создать тему
Опции темы

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