Содержимое указателя

235
06 января 2018, 03:13

Немного запутался:

  1. int *a=new int; - выделение памяти из кучи.
  2. a - адрес начала выделенных 6 байт
  3. *a - значение которое находится по адресу a

Неправильная запись в переменную

a=13; // 3) произошла запись не значения а адреса, то есть теперь адрес равен 13, а не какому-нибудь 0x12345678. 4)Теперь нельзя освободить часть кучи

Правильная запись в переменную

*a=13; // Разименнование указателя     

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

Answer 1

Думаю, только одно - адрес начала выделенных 6 байт - не то чтобы это невозможно, но пока даже не слышал об 6-байтных int.

А так - все верно.

Answer 2

int *a=new int; - выделение памяти из кучи.

В общем случае - да. Но, например, operator new может быть перегружен и тогда всё будет зависеть от его работы.

a - адрес начала выделенных 6 байт

В общем случае - нет. Например, если выделяется массив объектов non-pod типа, то new-expression может запросить больше памяти, и в начале выделенной памяти поместить количество созданных объектов в выделенной памяти, чтобы потом delete-expression мог вызвать необходимое количество деструкторов для созданных объектов. При этом new-expression вернет указатель уже не на начало выделенной памяти, а на ту память, в которой начинаются Ваши объекты, которыми Вы можете законно оперировать.

a=13; // 3) произошла запись не значения а адреса, то есть теперь адрес равен 13, а не какому-нибудь 0x12345678.

При таком коде возникнет ошибка компиляции, т.к. неявное преобразование из int в указательный тип запрещено. Но оно разрешено для литерала 0, поэтому код a = 0; собрался бы без проблем и да, значение бы стало равно нулю. При этом внутреннее представление указателя определяется реализацией и не обязано быть нулем. Однако, программе об этом заботиться не нужно, все необходимые преобразования из внутреннего представления в численный ноль и наоборот будут сделаны без Вашего участия.

4)Теперь нельзя освободить часть кучи

Если больше нигде нет сохраненного адреса, то да.

READ ALSO
Поиск максимальной суммы в подмассиве

Поиск максимальной суммы в подмассиве

Дан массив, требуется найти такой подмассив с максимальной суммой элементов в нем, чтобы начало и конец отрезка были одинаковыми(вывести...

265
Ошибка Adnroid studio [требует правки]

Ошибка Adnroid studio [требует правки]

Почему подчеркивает красной линией? Я только начала все это изучать, буквально час назадЧто делать?

164