Las matrices en C no se pueden asignar ni se pueden inicializar. Así es como las matrices están en C. Históricamente, en el contexto de valor (en el RHS de asignación) las matrices decaen en punteros, que es lo que formalmente impide la asignación y la inicialización de la copia. Esto se aplica a todas las matrices, no solo a las matrices char
.
El lenguaje C hereda este comportamiento de arrays de sus predecesores, los idiomas B y BCPL. En esos idiomas, las matrices estaban representadas por punteros físicos. (Y obviamente la reasignación de punteros no es lo que le gustaría que ocurriera cuando asigna una matriz a otra). En el lenguaje C, las matrices no son punteros, pero sí "simulan" el comportamiento histórico de las matrices B y BCPL al descomponerse a punteros en la mayoría de los casos. Este legado histórico es lo que mantiene las matrices en C no copiables hasta el día de hoy.
Una excepción de lo anterior es la inicialización con un literal de cadena. Es decir. usted puede hacer
char c[] = "abc";
pero eso es todo.
Esto significa que siempre que quiera copiar una matriz, debe usar una función de copia de memoria a nivel de biblioteca, como memcpy
. strcpy
es solo un sabor de eso específicamente diseñado para trabajar con cadenas.
Sí, sí uso punteros, simplemente no entiendo por qué s = "abc" no funciona en mi ejemplo. s es una matriz de caracteres, y también lo es "abc" ... –
@ C_p678 - no, 's' es una matriz de caracteres," abc "es un puntero a cadena constante. – MByD
@MByD: no del todo correcto. '" abc "' no es un puntero. '" abc "' una matriz de tipo 'char [4]', que en este contexto se descompone en un puntero de tipo 'char *'. Tenga en cuenta que en C la cadena no es constante. No es modificable, pero el tipo en sí no incluye el calificador 'const'. – AnT