инициализация массива строк - PullRequest
10 голосов
/ 20 октября 2011

Это продолжение другого вопроса У меня есть.

Рассмотрим следующий код:

char *hi = "hello";

char *array1[3] = 
{
    hi,
    "world",
    "there."
};

Он не компилируется, к моему удивлению (по-видимому, я не знаю синтаксис C так, как я думал) и генерирует следующую ошибку:

  error: initializer element is not constant

Если я поменяю char * на char [], он прекрасно скомпилируется:

char hi[] = "hello";

char *array1[3] = 
{
    hi,
    "world",
    "there."
};

Может кто-нибудь объяснить мне, почему?

1 Ответ

6 голосов
/ 20 октября 2011

В первом примере (char *hi = "hello";) вы создаете неконстантный указатель, который инициализируется так, чтобы указывать на статическую константную строку «hello».Этот указатель теоретически может указывать на что угодно.

Во втором примере (char hi[] = "hello";) вы конкретно определяете массив, а не указатель, поэтому адрес, на который он ссылается, не модифицируется.Обратите внимание, что массив можно рассматривать как неизменяемый указатель на конкретный блок памяти.

Ваш первый пример фактически компилируется без проблем в C ++ (по крайней мере, мой компилятор).

...