Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
snyppimylt
8 / 8 / 0
Регистрация: 18.12.2011
Сообщений: 400
1

Динамическая память [new]

24.02.2013, 21:25. Просмотров 678. Ответов 13
Метки нет (Все метки)

Если записать так:

C++
1
2
3
4
5
6
7
8
9
char *p;
p = new char[];
 
cin>>p;
 
for(int i=0; i<strlen(p); i++)
cout<<p[i]<<endl;
 
delete []p;
То он пишет про какую то точку останова, я вот не очень понимаю что это. Хотя вне компилятора в готовом виде (Relase) программа работает нормально. А если убрать delete [] p; то все будет работать нормально.

Объясните ламеру

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

0
Миниатюры
Динамическая память [new]  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2013, 21:25
Ответы с готовыми решениями:

Статическая память,Динамическая память.
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть...

Динамическая память C++
Народ, подскажите, плиз, что я делаю не так? Надо посимвольно ститать строку,...

Динамическая память.
Всем привет! Уважаемые знатоки, можете посмотреть мою реализацию класса...

Динамическая память
Здраствуйте!!!! Помогите выделить память под двумерные массив элементами...

Динамическая память с++
Как использовать динамическую память в с++

13
Seroga7
6 / 6 / 2
Регистрация: 08.12.2012
Сообщений: 147
24.02.2013, 22:11 2
Я точно не уверен, сам не силен в указателях, но:

C++
1
2
3
4
5
6
7
8
9
char *p; //Указатель на СИМВОЛ а не массив символов
p = new char[]; // Массив символов
 
cin>>p;
 
for(int i=0; i<strlen(p); i++)
cout<<p[i]<<endl;
 
delete []p;
Попробуй сделать char **p
1
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
24.02.2013, 22:15 3
Цитата Сообщение от snyppimylt Посмотреть сообщение
C++
1
p = new char[];
Надо указывать размер массива.
1
Seroga7
6 / 6 / 2
Регистрация: 08.12.2012
Сообщений: 147
24.02.2013, 22:21 4
Цитата Сообщение от gray_fox Посмотреть сообщение
Надо указывать размер массива.
Так тут же динамическое выделение памяти! Это для того и делается, что-бы потом размер задать
0
ITcrusader
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 22:27 5
Цитата Сообщение от Seroga7 Посмотреть сообщение
Так тут же динамическое выделение памяти! Это для того и делается, что-бы потом размер задать
Нет) Путаешь тёплое с мягким))) Под динамическим выделением памяти подразумевается возможность определить размер массива на этапе выполнения, т.е. задать в кач-ве размера переменную, значение которой будет использовано в кач-ве размера массива. При статическом выделении в кач-ве размерности выступает константа, т.е. её значение известно на этапе компиляции.
0
easybudda
Модератор
Эксперт CЭксперт С++
10148 / 6055 / 1522
Регистрация: 25.07.2009
Сообщений: 11,476
24.02.2013, 22:33 6
Цитата Сообщение от Seroga7 Посмотреть сообщение
Так тут же динамическое выделение памяти! Это для того и делается, что-бы потом размер задать
Нет, для ввода строк произвольной длины существует класс std::string, а размер массива, динамически создаваемого оператором new[], должен задаваться при создании. Мало того, в С++ нет средства, аналогичного realloc из С, и изменить размер массива можно только создав новый и скопировав в него исходный.
1
Seroga7
6 / 6 / 2
Регистрация: 08.12.2012
Сообщений: 147
24.02.2013, 22:33 7
Цитата Сообщение от ITcrusader Посмотреть сообщение
Нет) Путаешь тёплое с мягким))) Под динамическим выделением памяти подразумевается возможность определить размер массива на этапе выполнения, т.е. задать в кач-ве размера переменную, значение которой будет использовано в кач-ве размера массива. При статическом выделении в кач-ве размерности выступает константа, т.е. её значение известно на этапе компиляции.
Точно, там как минимум переменную в квадратных скобках задать нужно...
1
ITcrusader
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 22:54 8
Цитата Сообщение от easybudda Посмотреть сообщение
Нет, для ввода строк произвольной длины существует класс std::string, а размер массива, динамически создаваемого оператором new[], должен задаваться при создании. Мало того, в С++ нет средства, аналогичного realloc из С, и изменить размер массива можно только создав новый и скопировав в него исходный.
Ага, а потому, используй библиотеку, если только то, чем ты занимаешься - не есть ритуал посвящения в C++ программисты)))
1
snyppimylt
8 / 8 / 0
Регистрация: 18.12.2011
Сообщений: 400
24.02.2013, 22:58  [ТС] 9
Почитал я вас тут, половину все равно не понял, видимо литературы мало прочитал:

C++
1
2
3
4
5
6
7
8
9
10
11
char *p;
p = new char[10];
 
cin>>p;
 
for(int i=0; i<strlen(p); i++)
cout<<p[i]<<endl;
 
delete []p;
 
cout<<p;
Вот введу больше чем 10 символов, записывает, показывает и все работает нормально.

Добавлено через 2 минуты
Видимо перед работой в массиве как я понял, должно быть определено кол-во элементов.
0
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
24.02.2013, 22:58 10
Цитата Сообщение от snyppimylt Посмотреть сообщение
Вот введу больше чем 10 символов, записывает, показывает и все работает нормально.
Считай повезло, работать это не обязано.
1
snyppimylt
8 / 8 / 0
Регистрация: 18.12.2011
Сообщений: 400
24.02.2013, 23:02  [ТС] 11
Цитата Сообщение от gray_fox Посмотреть сообщение
Считай повезло, работать это не обязано.
Поясните пожалуйста, в смысле "повезло" ?

Добавлено через 2 минуты
А как тогда записать столько символов сколько хочешь?
0
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
24.02.2013, 23:07 12
Цитата Сообщение от snyppimylt Посмотреть сообщение
Поясните пожалуйста, в смысле "повезло" ?
В случае "выделил память под 10 символов, записал > 10" будет обращение к невыделенной памяти. Это приводит к непредсказуемому поведению программы, т.е. может упасть, может нет, как получиться. В любом случае делать так не стоит.

Добавлено через 1 минуту
Цитата Сообщение от snyppimylt Посмотреть сообщение
А как тогда записать столько символов сколько хочешь?
Пользоваться классами, которые сами управляют выделением памяти, std::string, например.
1
snyppimylt
8 / 8 / 0
Регистрация: 18.12.2011
Сообщений: 400
24.02.2013, 23:09  [ТС] 13
Цитата Сообщение от gray_fox Посмотреть сообщение
Пользоваться классами, которые сами управляют выделением памяти, std::string, например.
Хорошо, спасибо.
0
ITcrusader
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:13 14
Цитата Сообщение от gray_fox Посмотреть сообщение
может упасть, может нет, как получиться.
Может писать непотребные письма начальству или запускать ракеты с ядерными боеголовками откуда-нибудь, и правда,
Цитата Сообщение от gray_fox Посмотреть сообщение
делать так не стоит.
0
24.02.2013, 23:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 23:13

динамическая память....
Ввести двухмерном массив, для работы с массивом использовать указатель. Массив...

Динамическая память
в чем ошибка #include &lt;iostream&gt; #include &quot;conio.h&quot; using namespace std;...

Динамическая память
Надо ввести массив из файла. Сам массив хранится в динамической памяти. Сколько...


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

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

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