Разница между двумя методами инициализации указателя массива
Пожалуйста, объясните разницу между
char* str = "Hello";
А также
char* str = {"Hello"};
3 ответа
ISO 9899-1990 6.5.7 ("Инициализация") гласит:
Массив символьного типа может быть инициализирован литералом символьной строки, необязательно заключенным в фигурные скобки.
Между этими случаями нет никакой разницы.
Они оба присваивают адрес строкового литерала указателю на символ, но во втором случае для него используется необычный синтаксис.
Так же, int a = 42;
а также int a = {42};
эквивалентны.
В комментариях вы упомянули char *a = "Hello";
а также char a[] = "Hello";
,
Они совершенно разные. Второй создает массив. Это означает то же самое, что
char a[] = {'H','e','l','l','o','\0'};
Там нет номера внутри []
потому что компилятор может угадать размер массива для вас (6
в этом случае).
И другой случай совершенно другой.
Когда вы используете "string literal"
вне инициализации char
массив, как в этом случае
printf("Hello");
или же
char *a = "Hello";
компилятор неявно создает массив const char
держать вашу строку. Как вы знаете, в этих контекстах имя массива исчезает, чтобы указывать на его первый элемент. Так,
char *a = "Hello";
а также
const char internal_array[] = "Hello";
char *a = internal_array; // same as char *a = &internal_array[0];
эквивалентны.
Если вы попытаетесь сделать что-то вроде
char *a = "Hello";
a[0] = 'A';
вы получите сбой, потому что, несмотря на то, что указатель на неконстантный char
, a
на самом деле указывает на постоянную строку. Модификация это не очень хорошая идея.
Как насчет другого случая,
char a[] = "Hello";
a[0] = 'A';
отлично в порядке. В этом случае вы получите новый массив char
который содержит строку. Конечно, это неконстантный, так что вы можете изменить его.
Этот, как я считаю, является ранее ответом на вопрос. Ссылка была бы - фигурные скобки вокруг строкового литерала в объявлении массива char действительны? (например, char s[] = {"Hello World"})
Обе декларации одинаковы. Ответ на вопрос, почему он вообще существует, заключается в предоставлении некоторого разнообразия, чтобы удовлетворить вкусы кодировщиков (синтаксический сахар). Единственное, на что я хотел указать, это объявление переменной массива char против объявления указателя символа. Определенным вами указателям не было выделено никакой памяти. Следовательно, любые операции редактирования / записи в строке могут привести к ошибке сегментации. Рассмотреть вопрос об объявлении
char str[] = "Hello";
или же
char str[] = {"Hello"};