Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/56: Рейтинг темы: голосов - 56, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 20

Почему при выходе за пределы массива мы получаем «мусор», а не нули?

22.11.2022, 09:57. Показов 10890. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему при выходе за пределы массива мы получаем «мусор», а не нули?
Прошу объяснить подробно, почему, как и с чем это связано. Домашнюю работу задали на курсах)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2022, 09:57
Ответы с готовыми решениями:

Почему работает программа при выходе за пределы массива?
Добрый день, возникла проблема. Я задал одномерный массив из 10 элементов, однако, когда в я цикле пытаюсь присвоить значения большему...

Ошибка сегментации при выходе за пределы динамического массива
Всем привет. Вопрос: что нужно сделать (если это возможно), чтобы ВСЕГДА при выходе за пределы динамического массива была ошибка...

Почему при сложении элементов массива выводит мусор?
#include<stdio.h> #include <malloc.h> #include <math.h> int main(){ int n; int sum = 0; printf("Enter n = "); scanf("%d",...

49
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
24.11.2022, 15:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Undisputed Посмотреть сообщение
но уже zeroed страницей, если запрос на выделение памяти содержит просьбу обнулить содержимое памяти?
Что это вообще означает "запрос на выделение памяти с просьбой обнулить"?
Такого не бывает.
Инициализация, которая есть в этом примере,
Цитата Сообщение от Undisputed Посмотреть сообщение
C++
1
int* b = new int[5]{};
применяется к уже готовой, выделенной памяти.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.11.2022, 16:02
Цитата Сообщение от DrOffset Посмотреть сообщение
Что это вообще означает "запрос на выделение памяти с просьбой обнулить"?
У TheCalligrapher в сообщении было следующее:
При постраничном выделении возможно обнуление страницы, если вы его попросите
здесь же мы просим обнулить?

С другой стороны это сообщение выглядит так, что нужно просить обнуление определенной страницы, но в программе же мы не выделяем страницы, это подкапотные детали, куда мы не достаем... поэтому этот вариант я исключил, остался только {}
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
24.11.2022, 16:27
Цитата Сообщение от Undisputed Посмотреть сообщение
здесь же мы просим обнулить?
Нет.
Ну ты чего? Это же вообще несвязанные вещи, находящиеся на разных уровнях абстракции.
Как вообще может в голову прийти смешать инициализацию уровня языка и постраничное выделение памяти в ОС??

В любом случае инициализация технически выполняется после выделения памяти, тем самым образуя в ней валидные объекты. На уровень выделения памяти в менеджере памяти никакие детали создания объектов не просачиваются, не говоря уж про уровень ОС.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.11.2022, 16:35
Цитата Сообщение от DrOffset Посмотреть сообщение
Как вообще может в голову прийти смешать инициализацию уровня языка и постраничное выделение памяти в ОС??
По правде говоря прежде я даже и не думал об этом. Просто увидел пост, что запрос на обнуление сегодня бесплатный, т.к когда нужно зануленная память, то выделяется залуненная страница.
Цитата Сообщение от DrOffset Посмотреть сообщение
В любом случае инициализация технически выполняется после выделения памяти, тем самым образуя в ней валидные объекты.
Вот я был такого же мнения. Но как тогда объяснить это сообщение?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
При постраничном выделении возможно обнуление страницы, если вы его попросите, которое при этом реализуется зачастую не буквальным обнулением, а выделением страницы из заранее заготовленного пула обнуленных страниц, поддерживаемого ОС.
Мы же не оперируем в языке страницами, а просим N байт, обнуление которых доступно только через {}, насколько я помню
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
24.11.2022, 19:56
Цитата Сообщение от Undisputed Посмотреть сообщение
Но как тогда объяснить это сообщение?
Ну справедливости ради он нигде не писал, что "попросить" нужно обязательно средствами языка.
Кроме того совсем не обязательно, что под словом "мы" понимались обычные программисты.

Так что я бы трактовал это как: "человек, который пишет аллокатор на основе системных функций, может с помощью этих системных функций запросить обнуленные страницы".

Цитата Сообщение от Undisputed Посмотреть сообщение
Мы же не оперируем в языке страницами
Ну чисто логически, если речь зашла про страницы, то предполагать только контекст С++ уже бессмысленно. Этим упоминанием он вывел плоскость разговора далеко за пределы языка.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.11.2022, 21:51
DrOffset,
Если так то теперь все понятно, спасибо. О таком варианте я даже не подумал потому что это был ответ на вопрос ТС, который учитывая какие вопросы он задает, скорее всего имел ввиду языковую плоскость, поэтому я даже не подумал выходить за рамки этой плоскости
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
24.11.2022, 22:22
Цитата Сообщение от Undisputed Посмотреть сообщение
скорее всего имел ввиду языковую плоскость, поэтому я даже не подумал выходить за рамки этой плоскости
В языковой плоскости уже был ответ: UB.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.11.2022, 09:24
Alexey123446, UB и мусор за пределами массива это ортогональные вещи. Они существуют независимо. А необнулённость памяти не зависит от того кто использовал её. Если это была ваша же программа, но вы пытаетесь читать данные другого формата, то оно тоже будет мусором. Это тоже не зависит от тех кто в детстве не выиграл школьный конкурс "Самый умный".
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
26.11.2022, 14:24
Цитата Сообщение от Undisputed Посмотреть сообщение
Интересное утверждение, тогда как речь идет о конкретном языке программирования, который насколько я знаю этого не гарантирует. При этом не уточняется ОС, а в то что все разработчики ОС договорились и как то гарантируют такое поведение не очень то и верится. Можете пожалуйста поделиться, на чем основано такое общее утверждение?
Я не утверждал, что это гарантируется. Где вы такое увидели? Да и откуда вдруг пошла речь о "всех разработчиках ОС"?

Я фокусировался лишь на следующих моментах:

1. Обнуление выделенной памяти не обязано происходить на уровне user space, т.е. делаться через некий memset кодом программы или стандартной библиотеки, а в подходящих случаях может выполняться функциональностью ядра ОС. Это может быть как выделение памяти из пула заранее обнуленных страниц, так и средства обнуления "на лету" менеджера виртуальной памяти.

Это, разумеется, относится не к какому-то несчастному int a[10] = { 0 } или int *p = new int[10]{} в середине выполнения программы, а к большим блокам памяти, для которых можно ожидать перенаправления запроса на память на уровень ОС, или о неких начальных распределениях, для которых компилятор может гарантировать то, что они распределяются в "свежем" блоке памяти и т.д. и т.п. Это относится к ситуациям, когда обнуление не гарантируется языком, но может по возможности предоставляться (или даже гарантироваться) ОС, и к функциональности calloc (или даже некоего "большого" new int[]{}), где обнуление гарантируется языком.

А будет ли выделенная такими способами память действительно обнуленной в тех случаях, когда язык этого не гарантирует - может зависеть и от ситуации, и от настроек ОС, и еще много от чего. В частности, насколько я помню, современные ОС не позволят вам увидеть в выделенных страницах "мусор" от других приложений. То есть весь "мусор" который вы там видите - всегда ваш. Опять же, учитывая, что такие вещи могут очевидным образом выливаться в противоречие между безопасностью и производительностью, они могут регулироваться внутренними настройками ОС.

Например, выделяя память через malloc на старте программы на http://coliru.stacked-crooked.com или на локальных линуксах или виндах, я вижу девственно обнуленные страницы (кроме случаев отладочного CDCDCDCD, разумеется).

2. Современные ОС - это не DOS, к которому кто-то прикрутил доморощенный хак для запуска параллельных приложений. Поэтому когда кто-то начинает разглагольствовать о том, что мы, оказывается, работаем с "ОЗУ", в котором, ясное дело, болтаются данные от соседних приложений - это вызывает, мягко говоря, легкое недоумение.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
26.11.2022, 15:01
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я не утверждал, что это гарантируется. Где вы такое увидели? Да и откуда вдруг пошла речь о "всех разработчиках ОС"?
Согласен, однако вы сказали следующее:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
в современных десктопных операционных системах с виртуальной памятью, ваша программа не получает никакой материальной памяти сразу после выделения. Поэтому проблемы тяжелых затрат времени на обнуление на таких платформах просто не существует.
ну и возник резонный вопрос, вот у меня сейчас есть современная ОС с виртуальной памятью, и выделение обнуленной памяти должно быть бесплатным (точнее, сам процесс зануления), как впрочем и на любой другой, современной ОС... Это именно то, что вызвало вопросы. Но теперь после ряда уточнений мне стало ясно, о чем именно идет речь.

Благодарю за разъяснение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2022, 15:01
Помогаю со студенческими работами здесь

"Неопределенное поведение" при выходе вводимых данных за пределы массива
В условии задачи написано, что функция не проверяет индексы. И если введенные пользователем входные данные будут выходить за пределы...

При выходе из конструктора переменная уже указывает на мусор
Я не уверен, что я сделал не так, но при выходе из конструктора указатель созданный с помощью new, указывавший прежде на мой массив теперь...

Ошибка о выходе за пределы массива
При изменении условия s>1 на s>0 ошибка о выходе за пределы массива. как исправить? #include <iostream> #include <vector>...

Почему при передачи массива через ajax на выходе выходит строка?
Почему при передачи массива через ajax на выходе выходит строка? Говоря о выходе, я имею ввиду что данные, элементы массива, передаются в...

Прокрутка в canvas при выходе содержимого за пределы
Доброго временни суток. Возникло несколько проблем: Есть Canvas на форме. Предполагается динамически добавлять на него другие...


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

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru