Char объявление массива и инициализация в C
Мне было интересно, почему это не разрешено в C:
char myarray[4];
myarray = "abc";
И это разрешено:
char myarray[4] = "abc";
Я знаю, что в первом случае я должен использовать strcpy:
char myarray[4];
strcpy(myarray, "abc");
Но почему объявление и последующая инициализация не разрешены, а объявление и одновременная инициализация разрешены? Связано ли это с отображением памяти программ C?
Спасибо!
Ответы
Ответ 1
Это потому, что ваш первый фрагмент кода не выполняет инициализацию, а присваивание:
char myarray[4] = "abc"; // Initialization.
myarray = "abc"; // Assignment.
И массивы не могут быть непосредственно назначены в C.
Имя myarray
фактически разрешает адрес его первого элемента (&myarray[0]
), который не является lvalue, и как это не может быть целью назначения.
Ответ 2
Да, это своего рода несогласованность в языке.
"=" в myarray = "abc";
- это назначение (которое не будет работать, поскольку массив в основном является своего рода постоянным указателем), тогда как в char myarray[4] = "abc";
это инициализация массива. Нет возможности "поздней инициализации".
Вы должны просто запомнить это правило.
Ответ 3
Я думаю, что это два действительно разных случая. В первом случае память выделяется и инициализируется во время компиляции. Во втором - во время выполнения.
Ответ 4
myarray = "abc";
... является назначением указателя на "abc" на указатель myarray.
Это НЕ заполняет буфер myarray с помощью "abc".
Если вы хотите вручную заполнить буфер myarray, без strcpy(), вы можете использовать:
myarray[0] = 'a', myarray[1] = 'b', myarray[2] = 'c', myarray[3] = 0;
или
char *ptr = myarray;
*ptr++ = 'a', *ptr++ = 'b', *ptr++ = 'c', *ptr = 0;
Ваш вопрос касается разницы между указателем и буфером (массив).
Надеюсь, вы теперь понимаете, как C обращается к каждому виду.
Ответ 5
Это еще один пример C, где один и тот же синтаксис имеет разные значения (в разных местах). Хотя можно было бы утверждать, что синтаксис должен быть другим для этих двух случаев, это то, что есть. Идея заключается в том, что не "не разрешено", а второе означает что-то другое (это означает "назначение указателя" ).