Can someone please explain to me why strcpy() is necessary to assign strings to character arrays, such as in the following code snippet.
int main(void) {
char s[4];
s = "abc"; //Fails
strcpy(s, "abc"); //Succeeds
return 0;
}
What is the reason that s = "abc"
fails? And why is strcpy() the only way to assign strings to char arrays after they have been declared? It seems strange to me that you have to use a function to carry out a basic assignment.
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.