Может ли объект пересечь границу адресного пространства?

80
19 февраля 2022, 13:00

В C и C++ память адресуется побайтово. Если верить Стандарту, начало многобайтового объекта - это адрес его самого младшего байта. То есть - байта, который расположен ближе всех остальных байтов объекта к началу адресного пространства (к 0).

Мой вопрос заключается вот в чем:

  • Возможно ли, что валидный объект пересечет границу адресного пространства?

Вопрос касается как виртуальной памяти, так и физической.

Например, такой объект:

uint8_t arr[1024];

Или такой:

uint8_t *arr = malloc(1024);

Может ли:

&arr[x] > &arr[y]

Вернуть true, при условии, что x < y?

Answer 1

uint_t arr[1024] теоретически может пересечь границу выделенного ОС блока памяти, тогда это будет называться переполнением стека (stackoverflow :).

Во втором случае, если в куче не хватит места malloc запросит память у ОС и та выделит очередной блок и метод либо вернет адрес блока, который гарантированно в адресном пространстве процесса, либо вернет NULL если памяти не хватает.

&arr[x] > &arr[y] - да, условие всегда истинно если x > y

Что касается физической памяти, то при наличии механизма виртуальных адресов у процессора, ее распределением заведует ОС. Выход за пределы возможен только в случае наличия ошибок в функциях выделения памяти ОС

READ ALSO
Помогите составить запрос на выборку объявлений в mysql

Помогите составить запрос на выборку объявлений в mysql

для более наглядного представления проблемы опубликовал в sqlfiddle

109
Не прогружается приложение

Не прогружается приложение

Приложение работало (и на телефоне, и на эмуляторе), но после действий с регистрацией в приложении что-то пошло не такСамо приложение устанавливается...

86
Поиск слова в строке java

Поиск слова в строке java

Ввести строку с клавиатурыИз введенной строки выбрать все слова, начинающиеся на гласные буквы и заканчивающиеся на согласные

122