Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

На что указывает указатель пустого динамического массива?

26.04.2020, 23:29. Показов 1573. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На что указывает указатель возвращенный оператором new для размера 0? Я так понимаю если это добавили то зачем то оно нужно,где такое используется?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.04.2020, 23:29
Ответы с готовыми решениями:

Инициализация пустого динамического массива
Выводит мусор хранящиеся в массиве. Как инициализировать символьный динамический массив нулями? #include <iostream> ...

Инициализация пустого динамического массива
Выводит мусор хранящиеся в массиве. Как инициализировать символьный динамический массив нулями? #include <iostream> ...

на что указывает указатель
Доброго времени всем разработчикам,жёстким кодерам и просто любителям языка с++. Вопрос в следующем: Существует ли какая-либо...

17
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.04.2020, 23:36
На массив нулевой длины. Наверное, просто для универсальности сделали.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
26.04.2020, 23:41  [ТС]
nmcf, но он же не может указывать на массив , это же не указатель на массив)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.04.2020, 00:14
Если ты указываешь размер, то там квадратные скобки, а значит массив.
Или где у тебя 0? Пример.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.04.2020, 00:35
Цитата Сообщение от ReYalp Посмотреть сообщение
На что указывает указатель возвращенный оператором new для размера 0?
просто некоторый валидный адрес массива из нуля элементов.

поскольку количество элементов - ноль,
то разыменовывание такого указателя - UB.

Цитата Сообщение от ReYalp Посмотреть сообщение
он же не может указывать на массив
это почему это ещё не может?

массив из нуля элементов - точно такой же массив, только пустой.

ты знаешь, как delete [] догадывается какой именно размер у массива?
(если нет - погугли. на кб много раз это расжовывалось)

грубо говоря - по смещению от указателя.
обычно там по смещению какое то число. например: 10
значит через new[] выделялась память под массив из 10 элементов.

в случае с нулевым массивом - всё тоже самое. только число будет равным 0
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
27.04.2020, 00:42
Цитата Сообщение от ReYalp Посмотреть сообщение
На что указывает указатель возвращенный оператором new для размера 0? Я так понимаю если это добавили то зачем то оно нужно,где такое используется?
В С++ возврат нулевого указателя из new зарезервирован для обозначения вполне конкретной ситуации: ошибка выделения памяти в operator new. При этом запрос на память нулевого размера не является автоматически успешным или безуспешным. ("Even if the size of the space requested is zero, the request can fail"). Это важно в первую очередь для nothrow версии new, которая не имеет других средств индикации ошибки выделения памяти. В то же время удобно осознавать, что для бросающей исключения версии new возвращенный указатель гарантированно является ненулевым.

Вот именно поэтому new с массивом нулевого размера возвращает ненулевой указатель.

А зачем это может быть реально нужно на практике... Приходит в голову лишь возможность таким способом генерировать уникальные значения выровненных указателей. Это довольно расточительный способ, но тем не менее...

Что характерно, и в языке С malloc(0) имеет право возвращать ненулевой указатель. Этого не требуется, в отличие от С++, но дозволяется.

Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
но он же не может указывать на массив , это же не указатель на массив
Это единственное место в С++, где дозволяется явно создавать массив из нуля элементов. Объявления массивов и массивных типов нулевого размера запрещены. А вот динамическое выделение - поддерживается.
1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
27.04.2020, 01:04
Цитата Сообщение от ReYalp Посмотреть сообщение
На что указывает указатель возвращенный оператором new для размера 0?
На этот вопрос ответа в стандарте нет. И вряд ли скоро будет.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
27.04.2020, 02:39  [ТС]
hoggy, я имел ввиду что при создании динамического массива возвращается никак не указатель на массив, а на его первый элемент, хоть они и могут иметь одинаковые адреса

Добавлено через 3 минуты
TheCalligrapher, разве можно такой указатель назвать указателем на массив?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
27.04.2020, 02:46
ReYalp, Ну вообще то в С и С++ "массив" и "указатель на первый элемент" это одно и то же. для любого типизированного указателя определен оператор [].
Указатель же на массив имеет смысл отличать только в компайлтайме, только для статических массивов и только в тех контекстах в которых компилятор помнит размер массива.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
27.04.2020, 02:49  [ТС]
Fulcrum_013, это не одно и то же, массив - это один тип, указатель на первый элемент массива - другой
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
27.04.2020, 03:55
Цитата Сообщение от ReYalp Посмотреть сообщение
массив - это один тип
Тип массива - это компайлтаймовое понятие, которое актуально только для статических массивов и только в тех контекстах в которых компилятор может помнить длину.
т.е.
C++
1
2
3
4
5
6
7
void Foo(int* a) { std::cout << typeid(a).name() <<std::endl; }
int main() {
    int a[20]; // 
    std::cout << typeid(a).name() << std::endl;
    Foo(a);
};
}
вывод будет:
int [20]
int * __ptr64

В первом случае компилятор знает размер во время компиляции во втором нет.
С динамическим массивом по определению второй случай.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
27.04.2020, 04:48
Цитата Сообщение от ReYalp Посмотреть сообщение
разве можно такой указатель назвать указателем на массив?
А почему бы и нет? Стандарт ведь называет. Только это формально правильно это называется указателем на начало массива из нуля элементов, а не "на массив".

Спецификация языка не запрещает формирования массивов из нуля элементов. Спецификация языка запрещает лишь объявление в коде программы массивных типов T[N], когда N <= 0. Но new T[0] как раз таки обходится без этого.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
27.04.2020, 05:06
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А почему бы и нет? Стандарт ведь называет.
Стандарт никак не называет значение, которое получается в результате new T[0].
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Только это формально правильно это называется указателем на начало массива из нуля элементов, а не "на массив".
Что такое "указатель на начало массива"?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
27.04.2020, 05:51
Цитата Сообщение от argcargv Посмотреть сообщение
Стандарт никак не называет значение, которое получается в результате new T[0].
Я вел речь об объекте, который создается в динамической памяти при выполнении new T[0], а не о результате выражения new T[0]. ("When the value of the expression is zero, the allocation function is called to allocate an array with no elements.")

Цитата Сообщение от argcargv Посмотреть сообщение
Что такое "указатель на начало массива"?
Результат выражения new [] стандарт открытым текстом называет указателем на начальный (initial) элемент созданного массива. Именно это я имел в виду, под указателем на начало массива.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
27.04.2020, 05:59
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я вел речь об объекте, который создается в динамической памяти
Это:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
разве можно такой указатель назвать указателем на массив?
А почему бы и нет? Стандарт ведь называет. Только это формально правильно это называется указателем на начало массива из нуля элементов, а не "на массив".
не особо похоже про речь об объекте. Скорее об указателе. Ну да ладно.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Результат выражения new [] стандарт открытым текстом называет указателем на начальный (initial) элемент созданного массива.
Только в случае массивов с положительным числом элементов:
Цитата Сообщение от [expr.new]/6
When the allocated object is an array (that is, the noptr-new-declarator syntax is used or the new-type-id or type-id denotes an array type), the new-expression yields a pointer to the initial element (if any) of the array.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
27.04.2020, 11:26  [ТС]
TheCalligrapher,
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Стандарт ведь называет. Только это формально правильно это называется указателем на начало массива из нуля элементов, а не "на массив".
Но ведь существует отдеально указатель на массив T(*name)[n] , а есть указатель на первый элемент(начало) массива, это же разные понятия,не?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
27.04.2020, 11:35
Цитата Сообщение от ReYalp Посмотреть сообщение
Но ведь существует отдеально указатель на массив T(*name)[n] , а есть указатель на первый элемент(начало) массива, это же разные понятия,не?
Именно так. Это разные понятия. Но в разговорной речи зачастую и то и другое называется указателем на массив. О чем идет речь обычно ясно из контекста.
1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
15.07.2022, 06:07
https://cplusplus.github.io/CWG/issues/2532.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.07.2022, 06:07
Помогаю со студенческими работами здесь

На что указывает указатель на массив?
На что указывает указатель на массив? С указателем на первый элемент все понятно - он указывает на первый элемент массива, но более точно...

Копия того на что указывает указатель
Добрый вечер, форумчане. Возникла такая проблема template&lt;class Figure&gt; class t_node { public: int id; Figure *f_m; ...

Указатель и как запретить изменение на то что указывает
Сделал класс с указателем. В методе мне нужно запретить изменение того что находится по указателю в методе(НЕ САМ УКАЗАТЕЛЬ). Объявляю...

для чего нужен указатель head и на что он указывает?
для чего нужен указатель head и на что он указывает? для чего нужен указатель next в типе TPhoneRecord? когда head=nil? unit...

Узнать номер элемента массива на который указывает указатель
Может вопрос глупый но тока что об этом задумался! Можно ли узнать номер элемента массива на который указывает указатель не используя...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru