Все номера, которые вы указываете, и тип памяти, в которой хранится строковый литерал, зависят от платформы.
Что является более эффективным способом для хранения строк, массив или указатель
Некоторые педантизм о терминологии: Указатель не может хранить строку; он сохраняет адрес. Строка всегда хранится в массиве, и указатель может указывать на нее. Строковые литералы, в частности, хранятся в массиве статической продолжительности хранения.
Способ 1: использование массива char a[]="str"
;
Это делает копию содержимого строкового литерала в локальный массив продолжительности автоматического хранения.
Метод 2: char *b="str";
Вы не можете связать нон указатель константный к строкового литерала в стандартном C++. Это плохо сформировано на этом языке (начиная с C++ 11, до этого конверсия была просто устаревшей). Даже в C (и расширениях C++), где это преобразование разрешено, это довольно опасно, поскольку вы можете случайно передать указатель на функцию, которая может попытаться изменить указанную строку. Корректность верности заменяет случайный UB ошибкой времени компиляции.
Игнорируя это, это не делает копию литерала, но указывает на него.
Таким образом, метод 1 всегда лучше метода 2 для хранения строк в C/C++.
Использование памяти - не единственная метрика, которая имеет значение. Метод 1 требует копирования строки из литерала в автоматический массив. Не делать копии обычно быстрее, чем делать копии. Это становится все более важным со все более длинными строками.
Основное отличие метода 1 и 2 состоит в том, что вы можете изменить локальный массив метода 1, но вы не можете изменять строковые литералы. Если вам нужен модифицируемый буфер, то метод 2 не дает вам этого - независимо от его эффективности.
В методе one 'a' по-прежнему является указателем на данные« str », только с некоторым синтаксическим сахаром. –
И почему вы думаете, что 'a' не занимает никакой памяти в методе 1? Что на ваш взгляд? – PeterK
нет * «ROM» * внутри вашего компьютера ... – specializt