2015-03-03 4 views
-3

Мне было интересно, можно ли динамически выделить строковый литерал?динамически выделять строковый литерал

Я знаю, что вы в состоянии сделать

char * letter = new char('b'); 

но можно выделить строку буквального как то

Например:

char * letter = new char("Hello"); 
+0

языка программирования Что вы спрашиваете это? – Hybris95

+0

Это для C++. – anerk

+0

Вы можете привязать свою строку только для чтения к новому динамически распределенному буферу? – Evert

ответ

1

Что вы можете и должны сделать, это использовать std::string и инициализировать его с буквальным как

std::string mystring{"Hello"}; 

Когда вы сделаете это, mystring выделяется в стеке, и его содержание инициализируется из "Hello" (возможно, путем копирования , но читайте о оптимизации небольших строк или оптимизации коротких строк).

Если эта строка уничтожена (например, в конце содержащего блока), ее память (и, возможно, внутренняя копия, если она была создана) будет выпущена.

Если вы настаиваете на наличии указателя на строку C, выделенную кучей, вы можете использовать strdup (затем отпустите его с помощью free, а не delete); если вы хотите сырой массив char, вы могли бы использовать

char* p = new char[sizeof("Hello")]; // or new char[6] 
strcpy(p,"Hello"); 

, но это работает только для буквенных строк как "Hello" и вы должны использовать же символьной строку "Hello" дважды (или использовать strlen("Hello")+1 вместо sizeof("Hello"), который равен 6, из-за завершающего нулевого байта).

Обратите внимание, что во всех случаях вы никогда не динамически выделяете строковый литерал. Компилятору разрешено (и часто) помещать литеральную строку в read-only code segment произведенного двоичного файла executable. Что вы можете сделать, это выделить в куче зона памяти заполнена скопировать этой символьной строки (или используйте указательconst char* pc = "hello";)

+0

Спасибо, это было хорошее объяснение. – anerk

-2

Нет, это не потому, что когда ты написали

char * letter = new char("Hello");

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

+0

Nevermind then. – anerk

+0

это неправда. на самом деле это бессмысленно/бессмысленно. –

+0

@ TheParamagneticCroissant: 'ошибка: неверное преобразование из 'const char *' в 'char'' –

1

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

Вы можете, конечно, динамически выделить char и инициализировать его из литерала, как вы это делали в своем примере.

Что касается вашего вопроса, хотя, инициализация из строковых литералов является немного более сложным, потому что вы можете только получить свой собственный char[N] из строкового литерала инициализации с помощью обычной инициализации синтаксиса:

char[] str = "hello"; // special rules apply here 

и не возможно инициализировать динамически распределенный массив. В синтаксисе new[] просто невозможно сделать это.


Вы можете динамически выделить указатель на строку буквального:

const char** s = new const char*("hello"); 

но это совершенно бесполезно.


Ближайший я думаю, что вы можете получить:

char* str = new char[5]{'h','e','l','l','o'}; 

Но, если честно, просто использовать std::string вместо:

std::string str("hello"); 

Он был изобретен специально для решения этих виды проблем.

+0

Спасибо за помощь! – anerk

0

Попробуйте как этот

int size = 6; 
char * letter = new char[size]; 

strcpy(letter, "Hello"); 
std::cout << letter; 

delete[] letter; 

Но помните, чтобы удалить переменную, так как в этом примере переменная «буква» присвоенного в «куче»

+1

За исключением 2015 года, и мы не использовали raw 'new []' и 'delete []' в течение многих лет. 'auto letters (std :: make_unique (6));' было бы лучше. Или, знаете, 'std :: string' ... –

+0

Я знаю это! вопрос был не о std :: string – Garnik

+1

Ум вопрос был о динамическом распределении строки. Это _is_ 'std :: string'. То, что вы здесь делаете, учит устаревшим и опасным методологиям. Безответственный! –

Смежные вопросы