Разница между двумя методами инициализации указателя массива

Пожалуйста, объясните разницу между

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"};
Другие вопросы по тегам