Arrays in C are non-assignable and non-copy-initializable. That's just how arrays are in C. Historically, in value context (on the RHS of assignment) arrays decay to pointers, which is what formally prevents assignment and copy-initialization. This applies to all arrays, not only to char
arrays.
C language inherits this arrays behavior from its predecessors - B and BCPL languages. In those languages arrays were represented by physical pointers. (And obviously re-assignment of pointers is not what you'd want to happen when you assign one array to another.) In C language arrays are not pointers, yet they do "simulate" the historical behavior of B and BCPL arrays by decaying to pointers in most cases. This historical legacy is what keeps C arrays non-copyable to this day.
One exception from the above is the initialization with a string literal. I.e. you can do
char c[] = "abc";
in which case conceptually we are copying string literal "abc"
to array c
. Another exception is array wrapped into a struct type, which is copied when the whole struct object is copied. And that's about it.
This means that whenever you want to copy a naked (non-wrapped) array, you have to use a library-level memory copying function, like memcpy
. strcpy
is just a flavor of that specifically tailored to work with strings.
{ val0, val1, ... }
. – Iraq