Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Динамическое выделение памяти указателю - C++
есть указатель Piece* p; его нужно проинцилизровать динамическим способом. чтобы было примерно так Piece* p;

Выделение динамической памяти указателю в локальной функции - C++
Собственно, я не до конца понимаю, что происходит, поэтому прошу если кто может как можно доходчивее пояснить. Упрощенная версия кода...

Извлечение из памяти по указателю - C++
Не могу понять, как с помощью указателя извлечь строку из памяти имея адрес типа Integer. Указателю ведь нельзя присвоить значение нужного...

Получение значений памяти по указателю - C++
проблема следующая, имею многоуровневый указатель (изобразил как смог в общих чертах, два варианта) вар_1 offset | address ...

Выделение памяти, проверка на утечку памяти - C++
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

7
nord_v
228 / 177 / 69
Регистрация: 22.08.2013
Сообщений: 724
21.01.2016, 13:04 #2
Цитата Сообщение от Aqua77 Посмотреть сообщение
Ведь при присваивании строки например "123456789" указателю автоматически присваивается нужное количество памяти для хранения определённой строки.
Указателю присваивается адрес строкового литерала, который хранится в статической памяти, и доступен только для чтения.
0
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,068
Завершенные тесты: 1
21.01.2016, 16:17 #3
Цитата Сообщение от Aqua77 Посмотреть сообщение
Зачем строковому указателю на char* s1; выделять память s1=new char[10].
для того чтобы выделить ее не на этапе компиляции, а в тот момент, когда нужно. при чем такую память можно и нужно будет очистить потом
0
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
21.01.2016, 16:24 #4
Цитата Сообщение от Raali Посмотреть сообщение
для того чтобы выделить ее не на этапе компиляции
Вовсех случаях не на этапе компиляции. Сомневаюсь, что на этапе компиляции можно выделить память на компьютере, где будет запускаться exe файл.

Цитата Сообщение от Raali Посмотреть сообщение
при чем такую память можно и нужно будет очистить потом
В большенстве случаев нужно, но есть случаи когда ненадо)
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
21.01.2016, 18:09 #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';
0
Aqua77
25 / 25 / 16
Регистрация: 13.07.2015
Сообщений: 431
22.01.2016, 08:28  [ТС] #6
char *str2 = "132456789";-Это строковая константа имеет один адрес?
в отличии
char str2[]="123456789" - Для каждого символа свой адрес.
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
22.01.2016, 09:03 #7
Неправильно сказано. В первом случае имеем два объекта: массив из 10 элементов (строка) и указатель str2, указывающий на этот массив (строку). Во втором случае имеем только один объект: массив из 10 элементов
0
nord_v
228 / 177 / 69
Регистрация: 22.08.2013
Сообщений: 724
22.01.2016, 13:12 #8
Цитата Сообщение от Aqua77 Посмотреть сообщение
Это строковая константа имеет один адрес?
Начало этого строкового литерала имеет один адрес, который присваивается указателю. Каждый символ в нём имеет, соответственно, свой адрес (доступ к символам, только для чтения, через индексы, или арифметику указателей).
Цитата Сообщение от Aqua77 Посмотреть сообщение
в отличии
char str2[]="123456789" - Для каждого символа свой адрес.
Тут строковый литерал копируется в массив char. В массиве Си-строка, доступная для чтения/записи.
0
22.01.2016, 13:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2016, 13:12
Привет! Вот еще темы с ответами:

Выделение памяти - C++
В чём ошибка выделения памяти? Подскажите, друзья! #include "stdafx.h" #include "stdio.h" #include <iostream> #include...

Не выделение памяти - C++
По какой причине не работает это программа ? #include<iostream> #include <string> using namespace std; int main () ...

Выделение памяти. - C++
Значит так.Задача такая. Ввести строки или строку символов. Сколько мы будем вводить символов неизвестно.Может быть 10 а может быть...

Выделение памяти - C++
Можно ли сделать так, чтобы в memory выделилась память для 5 int объектов, а затем раздать ее разным переменным? Пытался таким образом и...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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