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

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

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

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

12.05.2012, 11:38. Просмотров 848. Ответов 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++ Найти слово "ТЕКСТ", если такое слово есть,то отпечатать его номер в строке.
Есть двумерный массив символов, в каждой строке находится номер, мне надо к каждой строке добавить "8029" как это сделать? C++
Как сделать поле с "|", #, "-" и цифрами C++
Как использовать символы из русского алфавита, а так же символы типа "█" "░" и т.д.? C++
Удалить ту строку в котором есть слово "нет" C++
C++ Конструктор Шредингера "нет подходящего конструктора по умолчанию", хотя он есть
C++ Есть массив Т [5], каждый элемент которого имеет тип "Структура Телефон". Ввести его с клавиатуры
Из слова вертикаль путем "вырезок" и "склеек" его букв получить слова тир и ветка C++
C++ Как сделать execl("my", "arg", argv)?
C++ Чтение файла с данными типа real. Тип real в билдере или как его "обойти"?
Есть ли в std, или где-нибудь ещё, константа для пустой строки (""), как endl (\n) для символа переноса? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.05.2012, 11:40     "мёд как бы есть, но его как бы нет" #2
Это называется undefined behavior, что на русский можно перевести как "неопределенное поведение". Это значит, что стандарт не предусматривает результат такой операции, и может произойти что угодно(на разных компиляторах - разное поведение). Например, может пойти дождь.
ValeryS
Модератор
6452 / 4918 / 451
Регистрация: 14.02.2011
Сообщений: 16,311
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
Модератор
6452 / 4918 / 451
Регистрация: 14.02.2011
Сообщений: 16,311
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     "мёд как бы есть, но его как бы нет"
Ответ Создать тему
Опции темы

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