asignando una cadena a otra cadena

¿Por qué este código no se está ejecutando? ¿Por qué no se asigna str1 a str2? Sé que tengo la opción de usar strcpy pero deseo saber por qué esto no funciona.

#include int main() { char str1[]="hello"; char str2[10]; str2=str1; printf("%s",str2); return 0; } 

Considerando que si utilizo punteros que funciona como aquí ..

 #include int main() ( char *s="good morning"; char *q; q=s; while(*q!='\0') { printf("%c",*q); q++; } return 0; } 

Esto funciona. Ahora la cadena se ha copiado mediante punteros, ¿por qué tanta diferencia?

Necesitas hacer

strcpy (str2, str1)

necesita copiar cada elemento del str1 a str2 carácter por carácter.

Lo que está haciendo es intentar asignar la dirección de la cadena en str1 asignar a la matriz var str2 que no está permitido. Las matrices estáticas no se pueden utilizar para asignar valores.

Incluso si tuvieras char *str2; y luego str2 = str1 aunque su código funcionaría, pero en tal caso, la cadena no se copia, en su lugar, la dirección de la cadena en str1 se copia en str2 por lo que ahora la desreferenciación de str2 apuntará a la cadena

También tenga en cuenta que cuando copia una cadena en un char *str2 siempre asigne suficiente memoria antes de copiar. Una posibilidad es:

 str2 = malloc (sizeof (char) * (strlen (str1) + 1)); strcpy (str2, str1); 

str2 es una matriz estática. No puedes simplemente reasignarlo como un puntero.

En cuanto al ejemplo del puntero, q=s reasigna q para apuntar al mismo espacio que s está apuntando. Sin embargo, la reasignación del puntero no copia el valor.

Para matrices estáticas, use strcpy() para copiar el valor. Para los punteros, use strdup() .

str2 y str1 refieren a la dirección de sus primeros elementos, por lo que la asignación de matrices no se realiza de esta manera. Use str[] para asignar char por char o use strcpy incorporado.

También puede usar strdup () que asigna la cantidad exacta de espacio necesario para almacenar una copia.

En C solo puedes asignar objetos que tengan tipo ; y en C una cadena no es un tipo de datos. En cambio, es una convención: la convención es que las cadenas están representadas por matrices de caracteres terminadas en nulo; y como las matrices no se consideran como tipos, tampoco lo son las cadenas.

En tu segundo fragmento de código, simplemente has hecho q apunta a s ; esta no es una copia de la cadena en s , sino simplemente una copia de los punteros ‘s. Ambos se refieren a los mismos datos en la memoria. Así que si, por ejemplo, cambió la cadena en ‘s’ y luego imprimió la cadena en ‘q’, verá que los datos en ‘q’ también han cambiado. Más directamente si hiciste printf( "s:%p, q:%p" (void*)s, (void*)q ) ; Verás que ambos tienen el mismo valor de puntero.