указатели — C ++, что конкретно делает новый & lt; datatype & gt; (& lt; value & gt;)?

В этом коде:

int * p = new int(44);

p выделяется в куче, и значение, на которое он указывает, равно 44;
но теперь я могу сделать что-то вроде этого:

p[1] = 33;

без получения ошибки. Я всегда думал

int * p = new int(44);

был просто еще один способ сказать, что «P выделяется в куче и указывает на адрес, содержащий 44», но, очевидно, это делает p указателем на массив целых чисел? размер этого нового массива 44? Или это необычный результат?

2

Решение

Вы были правы: P выделяется в куче и указывает на адрес, содержащий 44. Массив не выделен. p[1] = 33; это то, что они называют «неопределенным поведением». Ваша программа может быть сбой, но он не гарантированно завершится каждый раз, когда вы делаете это.

5

Другие решения

int *p_scalar = new int(5); //allocates an integer, set to 5.

Если вы получаете доступ к p_scalar [n] (n <> 0) может произойти сбой

0

В вашем примере язык C ++ предоставляет реализацию по умолчанию для оператора подписки для указателей, который выглядит примерно так:

(*Ptr)& operator[](size_t index)
{
return *(address + index*sizeof(*Ptr));
}

Это всегда может быть перегружено и заменено для любого типа. Целые числа не являются исключением, когда вы говорите:

int * pointer = alocate_int_array();
pointer[1] = 1;

Вы используете дополненную компилятором реализацию по умолчанию этого оператора.

0
По вопросам рекламы [email protected]