Массивы в C не могут быть назначены и инициализированы без копирования. Именно так обстоит дело с массивами в C. Исторически в контексте значений (в RHS назначения) массивы распадаются на указатели, что формально предотвращает назначение и инициализацию копирования. Это относится ко всем массивам, а не только к char
массивам.
Язык C наследует это поведение массивов от своих предшественников - языков B и BCPL. На этих языках массивы были представлены физическими указателями. (И, очевидно, переназначение указателей - это не то, что вы хотели бы произойти, когда вы присваиваете один массив другому.) В языке C массивы не являются указателями, однако они «имитируют» историческое поведение массивов B и BCPL, разрушаясь указатели в большинстве случаев. Благодаря этому историческому наследию массивы C не подлежат копированию до сих пор.
Единственным исключением из вышеприведенного является инициализация строковым литералом. То есть Вы можете сделать
char c[] = "abc";
но это все.
Это означает, что всякий раз, когда вы хотите скопировать массив, вы должны использовать функцию копирования памяти на уровне библиотеки, например memcpy
. strcpy
- это просто разновидность, специально предназначенная для работы со строками.