Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Aqua77
25 / 25 / 16
Регистрация: 13.07.2015
Сообщений: 427
#1

Выделение памяти указателю операцией new - C++

21.01.2016, 12:54. Просмотров 219. Ответов 7
Метки нет (Все метки)

Зачем строковому указателю на char* s1; выделять память s1=new char[10]. Ведь при присваивании строки например "123456789" указателю автоматически присваивается нужное количество памяти для хранения определённой строки.
Объясняется якобы чтобы чтобы лишняя память не занималась. При инициализации указателя не выделяется определённый участок. Или я не прав?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 724
21.01.2016, 13:04     Выделение памяти указателю операцией new #2
Цитата Сообщение от Aqua77 Посмотреть сообщение
Ведь при присваивании строки например "123456789" указателю автоматически присваивается нужное количество памяти для хранения определённой строки.
Указателю присваивается адрес строкового литерала, который хранится в статической памяти, и доступен только для чтения.
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,054
Завершенные тесты: 1
21.01.2016, 16:17     Выделение памяти указателю операцией new #3
Цитата Сообщение от Aqua77 Посмотреть сообщение
Зачем строковому указателю на char* s1; выделять память s1=new char[10].
для того чтобы выделить ее не на этапе компиляции, а в тот момент, когда нужно. при чем такую память можно и нужно будет очистить потом
rikimaru2013
C++ Game Dev
2377 / 1071 / 234
Регистрация: 30.11.2013
Сообщений: 3,553
21.01.2016, 16:24     Выделение памяти указателю операцией new #4
Цитата Сообщение от Raali Посмотреть сообщение
для того чтобы выделить ее не на этапе компиляции
Вовсех случаях не на этапе компиляции. Сомневаюсь, что на этапе компиляции можно выделить память на компьютере, где будет запускаться exe файл.

Цитата Сообщение от Raali Посмотреть сообщение
при чем такую память можно и нужно будет очистить потом
В большенстве случаев нужно, но есть случаи когда ненадо)
Evg
Эксперт CАвтор FAQ
17388 / 5626 / 351
Регистрация: 30.03.2009
Сообщений: 15,410
Записей в блоге: 26
21.01.2016, 18:09     Выделение памяти указателю операцией new #5
Цитата Сообщение от Aqua77 Посмотреть сообщение
Зачем строковому указателю на char* s1; выделять память s1=new char[10]. Ведь при присваивании строки например "123456789" указателю автоматически присваивается нужное количество памяти для хранения определённой строки
Условно можно считать такой код бесполезным. Он эквивалентен следующему:

C
char *p;
p = new char[10];
p = new char[10];
второй new есть смысловой эквивалент строкового литерала "123456789", т.к. и оператор new и строковой литерал представляют собой указатели не некоторую память. Просто оператор new выделаяет память на этапе исполнения, а строковой литерал уже распределён в памяти к тому времени, как мы попали в main (и в этом смысле мой пример не совсем эквивалент).

На всякий случай - что такое строковой литерал: http://www.cyberforum.ru/blogs/18334/blog97.html

Если предполагается, что ты через указатель p будешь что-то модифицировать, то строку "123456789" нужно скопировать в память, куда указывает p. И делать это следует через функцию strcpy:

C
char *p;
p = new char[10];
strcpy (p, "123456789");
p[3] = 'q';
Aqua77
25 / 25 / 16
Регистрация: 13.07.2015
Сообщений: 427
22.01.2016, 08:28  [ТС]     Выделение памяти указателю операцией new #6
char *str2 = "132456789";-Это строковая константа имеет один адрес?
в отличии
char str2[]="123456789" - Для каждого символа свой адрес.
Evg
Эксперт CАвтор FAQ
17388 / 5626 / 351
Регистрация: 30.03.2009
Сообщений: 15,410
Записей в блоге: 26
22.01.2016, 09:03     Выделение памяти указателю операцией new #7
Неправильно сказано. В первом случае имеем два объекта: массив из 10 элементов (строка) и указатель str2, указывающий на этот массив (строку). Во втором случае имеем только один объект: массив из 10 элементов
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2016, 13:12     Выделение памяти указателю операцией new
Еще ссылки по теме:

C++ выделение памяти
Выделение памяти C++
C++ Выделение памяти
C++ Получение значений памяти по указателю
Выделение памяти C++

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

Или воспользуйтесь поиском по форуму:
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 724
22.01.2016, 13:12     Выделение памяти указателю операцией new #8
Цитата Сообщение от Aqua77 Посмотреть сообщение
Это строковая константа имеет один адрес?
Начало этого строкового литерала имеет один адрес, который присваивается указателю. Каждый символ в нём имеет, соответственно, свой адрес (доступ к символам, только для чтения, через индексы, или арифметику указателей).
Цитата Сообщение от Aqua77 Посмотреть сообщение
в отличии
char str2[]="123456789" - Для каждого символа свой адрес.
Тут строковый литерал копируется в массив char. В массиве Си-строка, доступная для чтения/записи.
Yandex
Объявления
22.01.2016, 13:12     Выделение памяти указателю операцией new
Ответ Создать тему
Опции темы

Текущее время: 11:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru