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

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

Восстановить пароль Регистрация
 
Aqua77
4 / 4 / 1
Регистрация: 13.07.2015
Сообщений: 315
21.01.2016, 12:54     Выделение памяти указателю операцией new #1
Зачем строковому указателю на char* s1; выделять память s1=new char[10]. Ведь при присваивании строки например "123456789" указателю автоматически присваивается нужное количество памяти для хранения определённой строки.
Объясняется якобы чтобы чтобы лишняя память не занималась. При инициализации указателя не выделяется определённый участок. Или я не прав?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2016, 12:54     Выделение памяти указателю операцией new
Посмотрите здесь:

C++ Выделение динамической памяти указателю в локальной функции
Выделение памяти C++
Выделение памяти C++
Выделение памяти C++
Извлечение из памяти по указателю C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 723
21.01.2016, 13:04     Выделение памяти указателю операцией new #2
Цитата Сообщение от Aqua77 Посмотреть сообщение
Ведь при присваивании строки например "123456789" указателю автоматически присваивается нужное количество памяти для хранения определённой строки.
Указателю присваивается адрес строкового литерала, который хранится в статической памяти, и доступен только для чтения.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
21.01.2016, 16:17     Выделение памяти указателю операцией new #3
Цитата Сообщение от Aqua77 Посмотреть сообщение
Зачем строковому указателю на char* s1; выделять память s1=new char[10].
для того чтобы выделить ее не на этапе компиляции, а в тот момент, когда нужно. при чем такую память можно и нужно будет очистить потом
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2135 / 968 / 223
Регистрация: 30.11.2013
Сообщений: 3,237
21.01.2016, 16:24     Выделение памяти указателю операцией new #4
Цитата Сообщение от Raali Посмотреть сообщение
для того чтобы выделить ее не на этапе компиляции
Вовсех случаях не на этапе компиляции. Сомневаюсь, что на этапе компиляции можно выделить память на компьютере, где будет запускаться exe файл.

Цитата Сообщение от Raali Посмотреть сообщение
при чем такую память можно и нужно будет очистить потом
В большенстве случаев нужно, но есть случаи когда ненадо)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,128
Записей в блоге: 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
4 / 4 / 1
Регистрация: 13.07.2015
Сообщений: 315
22.01.2016, 08:28  [ТС]     Выделение памяти указателю операцией new #6
char *str2 = "132456789";-Это строковая константа имеет один адрес?
в отличии
char str2[]="123456789" - Для каждого символа свой адрес.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,128
Записей в блоге: 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++ Получение значений памяти по указателю

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

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

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