Почему я получаю предупреждение компилятора за преобразование строкового литерала в символ *, это плохо? - PullRequest
3 голосов
/ 23 октября 2011

Таким образом, компилятор говорит мне, что это устаревшее преобразование из строкового литерала в char *:

 char* myString = "i like declaring strings like this";

Должен ли я беспокоиться об этом? Это неправильный способ сделать это?

Мне нужно передать myString в функцию, которая принимает char*, кому я должен правильно инициализировать char* без этого преобразования?

Ответы [ 2 ]

9 голосов
/ 23 октября 2011

Да, вы должны беспокоиться об этом!

Вы должны объявить это как:

const char* myString = "i like declaring strings like this";

mystring - указатель на строковый литерал "i like declaring strings like this", а строковый литерал находится в пространстве памяти (определенном реализацией), которое не должно изменяться вашей программой.
Изменение строкового литерала приводит к неопределенному поведению .

Следовательно, C ++ 03 Standard устарел, объявляя строковые литералы без ключевого слова const, Это гарантирует, что строковый литерал не может быть изменен через указатель.


Ответ на ваш вопрос Редактировать, @Benjamin уже опубликовал в комментариях, просто цитируя свой ответ:

Использовать массив:
char myString [] = "Мне нравится объявлять такие строки";
Это копирует литерал в массив, и копия может быть изменена

3 голосов
/ 23 октября 2011

Это даже не должно компилироваться. Если вам нужно передать его в функцию, которая, как вы уверены, не изменит строку, необходимую для использования const cast, ее одно из правильных применений:

functionName(const_cast<char *>("something"));

Или, если вы не хотите использовать const, вы можете скопировать строку в стек:

char str[] = "something";
functionName(str);
...