![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
dAnIK SeNT |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 8.2.2003 Где: Казань Репутация: нет Всего: нет |
Пишу я к примеру
char *myvar = "sdfsdf"; Очевидно, выделяется 7 байт памяти. Не должен ли я их освобождать самостоятельно? Т.е. понятно, что когда я пишу char myvar[255] = "sdfsd"; То все ок., т.к. данные размещаются в памяти статически. А вот в случае динамического размещения? Или еще пример:
Все ли я понимаю правильно? Вообще работа с указателями как-то неочевидна. Как я могу различить, когда я присваиваю значение указателю, а когда - тому на что он указывает? Скажем, у меня есть int *v; я хочу выделить под него память. как это сделать? и как ее потом освободить? допустим, я сделал это. Хочу изменить то значение на которое указывает v. Я пишу: v = 0xFFFFFF; А теперь я хочу сделать так, чтобы v указывал на участок памяти по адресу 0xFFFFFF. Как это сделать? Вопрос next. Некоторая функция возвращает мне строку, под которую она очевидно распределила память. Как мне освободить эту памть? Спасибо за внимание ![]() |
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
а значение *v=5; Освобождать желательно, это как правила хорошего тона. -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
Step |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
int *v; int o; v=new int; *v=5; сдесь по адрессу куда указывает v заноситься 5 o=4; v=&o; теперь v указывает на о в котором записано 4
delete v; Это сообщение отредактировал(а) Step - 27.2.2003, 01:57 -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
||||
|
|||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Почитай внимательно про область видимости и операторные скобки {....};
|
|||
|
||||
Step |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
правильно вот так
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
||||
|
|||||
dAnIK SeNT |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 8.2.2003 Где: Казань Репутация: нет Всего: нет |
А как же со строками? Почему прокатывает
char *v; v = "sdfsdfsdf"; И как в этом случае выделять/освобождать память? |
|||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Это точно такое же статическое размещение. Строка "sdfsdf" размещается в области глобальных данных, а myvar указывает на эту область. Так что в данном случае ничего освобождать не надо. |
|||
|
||||
Alex101 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: нет Всего: 10 |
А так нельзя делать. Надо сначала память под var1 выделить. А тут у тебя не должно ничего выделяться, просто семь байтов, начиная с var1 будут заняты твоей строкой, при этом, если там находятся данные, то они будут потеряны (навсегда ![]() Это сообщение отредактировал(а) Alex101 - 27.2.2003, 03:59 -------------------- С уважением, А. Фролов. |
|||
|
||||
Kefir |
|
|||
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: нет Всего: 87 |
а не легче делать char *var = new char; тут ясно и понятно, что так, мол, и так, выделяю память под мой var. А потом просто delete var;
|
|||
|
||||
Fantasist |
|
||||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Можно. Антон уже сказал. Строковый литерал (типа "....") имеет тип, точно не скажу какой, но, можно считать, что char* и выделяется статически, скорее всего в сегменте данных, и лежит там всегда с начала запуска программы до ее уничтожения. Когда вы присваиваете указателю char* значение такого литерала, вы просто записываете в указатель значение памяти, где лежит эта строка. -------------------- Волны гасят ветер... |
||||
|
|||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Легче разобраться, и никаких проблем. ![]() -------------------- Волны гасят ветер... |
|||
|
||||
Alex101 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: нет Всего: 10 |
2Fantasist Точно, строка в сегменте данных лежит. Потом в указатель ее адрес помещается.
Сори всем за свои поспешные выводы. Но все равно, так делать, скажем, некрасиво, что ли.... (с точки зрения кода) -------------------- С уважением, А. Фролов. |
|||
|
||||
Vaulter |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1724 Регистрация: 30.12.2002 Где: бункер Репутация: 2 Всего: 22 |
так, будет выделено памяти только под один символ. |
|||
|
||||
dAnIK SeNT |
|
||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 8.2.2003 Где: Казань Репутация: нет Всего: нет |
А так правильнее?
ЗЫ. Спасибо всем огромное за ответы ![]() |
||||
|
|||||
BlowFish |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 29.3.2002 Где: Санкт-Петербург Репутация: нет Всего: нет |
2 Step: Это же плохой пример, т.к. выделив сначала память
2 Fantasist: строковый литерал имеет тип const char*... |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |