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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> char* и динам. память 
V
    Опции темы
pvp
Дата 27.5.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



скажите такой код правельный
Код

char* str = "Hello";


или надо так
Код

char* str = new char[6];
strcpy(str, "Hello");

delete [] str;

PM MAIL   Вверх
bronislav
Дата 27.5.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код
Код

char *str = "Hello";

Насколько я знаю, так можно использовать - это означает, что память для данной строки будет выделена не в динамической памяти а в стеке.

Код

char* str = new char[6];
strcpy(str, "Hello");
delete [] str;


Также верен. Тут выделяется динамическая память.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
Fazil6
Дата 27.5.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(bronislav @  27.5.2008,  13:07 Найти цитируемый пост)
Насколько я знаю, так можно использовать - это означает, что память для данной строки будет выделена не в динамической памяти а в стеке.

не в стеке, а в сегменте данных. Правильно так
Код

char str[] = "Hello";

PM MAIL   Вверх
pvp
Дата 27.5.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Fazil6 @  27.5.2008,  13:19 Найти цитируемый пост)

Код

char str[] = "Hello";

это понятно, но я видел и такое
Код

char* str = "Hello";

по этому и интересуюсь, правельно ли это.
PM MAIL   Вверх
Fazil6
Дата 27.5.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(pvp @  27.5.2008,  13:22 Найти цитируемый пост)
по этому и интересуюсь, правельно ли это. 

смотря для чего. Стандартом это допустимо для совместимости со старым кодом. Изменять содержимое строки, которая так определена нельзя.
PM MAIL   Вверх
pvp
Дата 27.5.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за разъяснение. 

PM MAIL   Вверх
Rififi
Дата 27.5.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



константа может размещаться в памяти только для чтения, поэтому первый вариант правильнее так:
const char* str = "...";
PM MAIL   Вверх
bsa
Дата 27.5.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Итого:
Код
//размещение текста в области статических данных программы (в т.ч. и в самом коде)
char *text1 = "some text"; //неправильно, хотя работает для совместимости
const char *text2 = "some text"; //правильно, мы огораживаем себя от возможности случайно изменить содержимое

//размещение теста в стеке
char text3[] = "some text"; //при попадании на эту строчку в стеке будет выделена память
//и туда скопируется указанная строка, ее содержимое можно менять, но нельзя забывать
//о границах массива. Этот вариант работает дольше, чем предыдущий, зато оператор
//sizeof будет показывать размер строки. При выходе из функции строка уничтожается,
//поэтому нельзя возвращать указатель на такую строку за пределы функции, в которой
//она определена.
static const char text4[] = "some text"; // тоже самое, только запрещает менять содержимое
//и дает возможность компилятору оптимизировать таким образом, что данные будут
//размещены в статической области (т.е. не будут каждый раз копироваться). При выходе
//из функции строка не уничтожается, поэтому указатель на ее может покидать ее пределы.


Это сообщение отредактировал(а) bsa - 27.5.2008, 14:20
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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