Подтвердить что ты не робот

Char объявление массива и инициализация в C

Мне было интересно, почему это не разрешено в C:

char myarray[4];

myarray = "abc";

И это разрешено:

char myarray[4] = "abc";

Я знаю, что в первом случае я должен использовать strcpy:

char myarray[4];

strcpy(myarray, "abc");

Но почему объявление и последующая инициализация не разрешены, а объявление и одновременная инициализация разрешены? Связано ли это с отображением памяти программ C?

Спасибо!

4b9b3361

Ответ 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, где один и тот же синтаксис имеет разные значения (в разных местах). Хотя можно было бы утверждать, что синтаксис должен быть другим для этих двух случаев, это то, что есть. Идея заключается в том, что не "не разрешено", а второе означает что-то другое (это означает "назначение указателя" ).