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

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

Восстановить пароль Регистрация
 
Voroshek
6 / 6 / 1
Регистрация: 22.08.2011
Сообщений: 75
12.05.2012, 11:38     "мёд как бы есть, но его как бы нет" #1
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     "мёд как бы есть, но его как бы нет"
Посмотрите здесь:

Как сделать, так чтобы i и j можно было вводить самому "i" И "j" в цикле, есть программа C++
C++ Дана строка, в котором есть слово "да" или слово "нет". Если в нем есть слово "нет", то удалить его
Удалить ту строку в котором есть слово "нет" C++
C++ Дана точка на плоскости с координатами (х, у). Составить программу, которая выдает одно из сообщений "Да", "Нет", "На
Ошибка "error C2446: :: нет преобразования "int" в "char *" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.05.2012, 11:40     "мёд как бы есть, но его как бы нет" #2
Это называется undefined behavior, что на русский можно перевести как "неопределенное поведение". Это значит, что стандарт не предусматривает результат такой операции, и может произойти что угодно(на разных компиляторах - разное поведение). Например, может пойти дождь.
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
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
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
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     "мёд как бы есть, но его как бы нет"
Ответ Создать тему
Опции темы

Текущее время: 09:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru