Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки и распределение памяти в VS++ 
:(
    Опции темы
dAnIK SeNT
  Дата 27.2.2003, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 8.2.2003
Где: Казань

Репутация: нет
Всего: нет



Пишу я к примеру
char *myvar = "sdfsdf";
Очевидно, выделяется 7 байт памяти. Не должен ли я их освобождать самостоятельно? Т.е. понятно, что когда я пишу
char myvar[255] = "sdfsd";
То все ок., т.к. данные размещаются в памяти статически. А вот в случае динамического размещения?
Или еще пример:
Код

char *var1, *var2;
var1 = "sdfsdfd"; //выделилась память. надо ли освобождать?
var1 = var2; //var1 просто указывет туда же, куда var2
var1 = "ggggg"; //теперь содержимое var2 тоже равно ""ggggg"

Все ли я понимаю правильно?
Вообще работа с указателями как-то неочевидна. Как я могу различить, когда я присваиваю значение указателю, а когда - тому на что он указывает?
Скажем, у меня есть
int *v;
я хочу выделить под него память. как это сделать? и как ее потом освободить?
допустим, я сделал это. Хочу изменить то значение на которое указывает v. Я пишу:
v = 0xFFFFFF;
А теперь я хочу сделать так, чтобы v указывал на участок памяти по адресу 0xFFFFFF. Как это сделать?
Вопрос next. Некоторая функция возвращает мне строку, под которую она очевидно распределила память. Как мне освободить эту памть?
Спасибо за внимание smile.gif
PM MAIL WWW   Вверх
Step
Дата 27.2.2003, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Цитата
Вообще работа с указателями как-то неочевидна. Как я могу различить, когда я присваиваю значение указателю, а когда - тому на что он указывает?
указатель это просто v=....
а значение *v=5;
Освобождать желательно, это как правила хорошего тона.


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Step
Дата 27.2.2003, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
DENNN
Дата 27.2.2003, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Почитай внимательно про область видимости и операторные скобки {....};
PM ICQ   Вверх
Step
Дата 27.2.2003, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Цитата
Хочу изменить то значение на которое указывает v. Я пишу:
v = 0xFFFFFF;
это не правильно
правильно вот так
Цитата
Хочу изменить то значение на которое указывает v. Я пишу:
*v = 0xFFFFFF;



--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
dAnIK SeNT
Дата 27.2.2003, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 8.2.2003
Где: Казань

Репутация: нет
Всего: нет



А как же со строками? Почему прокатывает
char *v;
v = "sdfsdfsdf";
И как в этом случае выделять/освобождать память?
PM MAIL WWW   Вверх
AntonSaburov
Дата 27.2.2003, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Цитата
Пишу я к примеру
char *myvar = "sdfsdf";
Очевидно, выделяется 7 байт памяти. Не должен ли я их освобождать самостоятельно? Т.е. понятно, что когда я пишу
char myvar[255] = "sdfsd";
То все ок., т.к. данные размещаются в памяти статически. А вот в случае динамического размещения?


Это точно такое же статическое размещение. Строка "sdfsdf" размещается в области глобальных данных, а myvar указывает на эту область. Так что в данном случае ничего освобождать не надо.

PM MAIL WWW ICQ   Вверх
Alex101
Дата 27.2.2003, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



Цитата(dAnIK @ 26.2.2003, 22:29)
char *var1, *var2;
var1 = "sdfsdfd"; //выделилась память. надо ли освобождать?

А так нельзя делать. Надо сначала память под var1 выделить. А тут у тебя не должно ничего выделяться, просто семь байтов, начиная с var1 будут заняты твоей строкой, при этом, если там находятся данные, то они будут потеряны (навсегдаsmile.gif).

Это сообщение отредактировал(а) Alex101 - 27.2.2003, 03:59


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Kefir
Дата 27.2.2003, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



а не легче делать char *var = new char; тут ясно и понятно, что так, мол, и так, выделяю память под мой var. А потом просто delete var;
PM MAIL WWW Skype   Вверх
Fantasist
Дата 27.2.2003, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата(Alex101 @ 27.2.2003, 00:57)
Цитата(dAnIK @ 26.2.2003, 22:29)
char *var1, *var2;
var1 = "sdfsdfd"; //выделилась память. надо ли освобождать?

А так нельзя делать.

Можно. Антон уже сказал. Строковый литерал (типа "....") имеет тип, точно не скажу какой, но, можно считать, что char* и выделяется статически, скорее всего в сегменте данных, и лежит там всегда с начала запуска программы до ее уничтожения.
Когда вы присваиваете указателю char* значение такого литерала, вы просто записываете в указатель значение памяти, где лежит эта строка.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Fantasist
Дата 27.2.2003, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
а не легче делать char *var = new char; тут ясно и понятно


Легче разобраться, и никаких проблем. smile.gif


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Alex101
Дата 27.2.2003, 06:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



2Fantasist Точно, строка в сегменте данных лежит. Потом в указатель ее адрес помещается.
Сори всем за свои поспешные выводы.
Но все равно, так делать, скажем, некрасиво, что ли.... (с точки зрения кода)


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Vaulter
Дата 27.2.2003, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 2
Всего: 22



Цитата(Kefir @ 26.2.2003, 21:36)
а не легче делать char *var = new char;

так, будет выделено памяти только под один символ.


--------------------
PM MAIL WWW ICQ   Вверх
dAnIK SeNT
Дата 27.2.2003, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 8.2.2003
Где: Казань

Репутация: нет
Всего: нет



Цитата
а не легче делать char *var = new char;
так, будет выделено памяти только под один символ.

А так правильнее?
Код
char *var = new char[255];

ЗЫ.
Спасибо всем огромное за ответы smile.gif
PM MAIL WWW   Вверх
BlowFish
Дата 27.2.2003, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 29.3.2002
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(Step @ 27.2.2003, 02:42)
int *v;
int o;
v=new int;
*v=5; сдесь по адрессу куда указывает v заноситься 5
o=4;
v=&o; теперь v указывает на о в котором записано 4

2 Step: Это же плохой пример, т.к. выделив сначала память
Код
v=new int;
, а потом "перекинув" указатель:
Код
v=&o;
мы теряем память...

2 Fantasist: строковый литерал имеет тип const char*...
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0806 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.