![]() |
|
Модераторы: Poseidon |
![]()
|
|
| observateur |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 176 Регистрация: 10.6.2006 Репутация: нет Всего: нет |
Обьясните мне пожалоста если я назначил массив например 5 элементный.( в c++)
int array[5]; если я напишу cout<<array[6]; почему он мне дает какая та цифру. Это сообщение отредактировал(а) observateur - 11.7.2006, 19:20 |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
патамушта элементы в массиве нумеруются с array[0]..[4] и в array[6] тама уже массива нету а просто всякие случайные цыфири
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 1 Всего: 196 |
observateur, вообще тебе повезло, что на array[6] выдалось случайное число. Обычно, подобное действие приводит к "Приложение выполнило недопустимую операцию, и будет закрыто".
Кстати, а что ты хотел, чтобы эта команда выдала? |
|||
|
||||
| Friackazoid |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 23.2.2006 Репутация: 1 Всего: 3 |
Rockie,
Ну ты блин выдал... Неужели нельзя по научному сказать? array это константа указатель на нулевой эл-т массива и доступ к другим эл-там происходит по формуле *(array+ 1) при обрашение *(array+6) происходит обрашение к области памяти занятой другими данными. Там могут быть странные циферы или NULL. В случае NULL происходит acces violation инструкция обратилась к памяти 00000000 память не может быть реад. При случайный циферах прога без зазрения совести их выдает. ЗЫ и действительно, что за эксперимент такой странный был. --------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 6 Всего: 173 |
Не совсем так. Адрес array + 6 * sizeof(int) может находится за пределами сегмента или страницы виртуальной памяти, которая была выделена приложению. Обращение по этому адресу вызовет аппаратное исключение (aka segmentation fault, access violation, SIGSEGV и прочие страшные слова) и программа вылетит. Однако память выделяется с определенной гранулярностью (т.е. размер страницы должен быть кратен определенному числу байт), к тому же часто ради эффективности память у ОС не запрашивается на каждую аллокацию в программе, а управляется рантаймом языка (это относится к динамической памяти (malloc/new), стек всегда управляется ОС). Короче говоря, наш злосчастный массив с большой вероятностю не будет занимать всю страницу, а после последнего элемента будет либо неинициализированная память (aka случайные циферки А стандарт C/C++ выход за границы массива называет просто — undefined behaviour (неопределенное поведение). Т.е. мы вправе ожидать чего угодно: от случайных данных и SIGSEGV до форматирования жесткого диска Выход: использовать std::vector и метод at, либо самописные классы-векторы (статического или динамического размера), обеспечивающие контроль выхода за границы массива, либо писать не на C/C++ |
|||
|
||||
| Pete |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: 7 Всего: 12 |
Или просто не допускать таких ляпов)) -------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
Friackazoid, какой вопрос такой ответ..
Это сообщение отредактировал(а) Rockie - 11.7.2006, 23:32 -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 6 Всего: 173 |
Это проще сказать, чем сделать -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |