Должны ли статически объявленные массивы символов указанного размера быть инициализированы литералом в C? - PullRequest
2 голосов
/ 28 января 2011

Например,

gcc компилирует это нормально ...

char s[7] = "abc";

Но выдает ошибку "несовместимые типы в назначении" с ...

char s[7];
s = "abc";

Какая разница?

1 Ответ

7 голосов
/ 28 января 2011

Первая инициализация; это означает «объявить массив из 7 char в стеке и заполнить первые 3 элемента 'a', 'b', 'c', а остальные элементы '\0'».

Во втором случае вы не инициализируете массив ни к чему. Затем вы пытаетесь присвоить массиву, который никогда не будет действительным. Как-то так "сработало бы":

const char *s;
s = "abc";

Но значение будет немного другим (s теперь является указателем , а не массивом ). В большинстве ситуаций разница минимальна. Но есть несколько важных предостережений, например, вы не можете изменять содержимое. Кроме того, sizeof(s) даст вам размер указателя, тогда как в исходном коде он даст вам 7 (размер массива).

Рекомендуется прочитать следующее: http://c -faq.com / charstring / index.html .

...