Error: tipos incompatibles al asignar al tipo ‘char ‘ del tipo ‘char *’

Estoy tratando de asignar los valores de una estructura a un mapa pero aparece el siguiente mensaje de error después de comstackr:

error: incompatible types when assigning to type 'char[25]' from type 'char *' 

en

 map[i].n=mn 

Mi estructura se define de esta manera:

 struct m1{ int c; char n[25]; int q_m; int q;}; 

Parte de mi código:

  struct m1 m; struct m1 *map = 0; scanf("%d",&m.c); scanf("%s",&m.n); scanf("%d",&m.q_m); scanf("%d",&m.q); map[i].c=mc; map[i].n=mn; map[i].q_m=m.q_m; map[i].q=mq; 

Las expresiones de matriz pueden no ser el objective de una asignación; El operador = no está definido para copiar el contenido de una matriz a la otra.

Si n está destinado a contener una cadena terminada en 0, usa strcpy :

 strcpy( map[i].n, mn ); 

Si n pretende contener una cadena no terminada en 0 (o una secuencia de caracteres con valores de 0 incrustados), use memcpy :

 memcpy( map[i].n, mn, sizeof map[i].n ); 

A menos que sea el operando de sizeof o unary & operator, o si se utiliza un literal de cadena para inicializar otra matriz en una statement, una expresión de tipo “matriz de elementos N de T ” se convertirá (“decaer”) en una Expresión de tipo “puntero a T “, y el valor de la expresión será la dirección del primer elemento.

Es por eso que recibiste el mensaje de error que hiciste; la expresión mn tiene el tipo “matriz de 25 elementos de char “; ya que no era el operando de sizeof o unary & operadores, se convirtió al tipo char * . map[i].n no se convirtió (se mantuvo tipo char [25] ), pero como dije anteriormente, las expresiones de matriz pueden no ser el objective del operador de asignación.

Las variables de la matriz no pueden ser un lvalor para el operador de asignación, es decir, no se les puede asignar nada.

Para copiar una matriz, copie elemento por elemento o use una función de “bajo nivel” como memcpy() para copiar una cantidad específica de memoria a la vez:

 memcpy(map[i].n, mn, sizeof map[i].n); 

Primero necesitas asignar memoria para el map .

 struct m1 *map = malloc(sizeof(struct m1)); 

y usa strcpy para copiar mn a map->n .

 struct m1 *map; 

map es un puntero y deberías asignarle memoria antes de escribirle algo.

 map = malloc(sizeof(struct m1) * n); 

Entonces puedes tener

 map[i] 

Después de esta copia de cadena de corrección

 strcpy(map[i].n,mn); 

Parece que lo que probablemente desea hacer (además de asignar memoria para la estructura) es copiar el contenido de la matriz a la que apunta n , en lugar de solo copiar el puntero real.

 strcpy(map[i].n, mn); 

Copias todos los miembros de la estructura. La forma más sencilla de hacerlo es:

 map[i]=m; 

Parece que está intentando asignar directamente un valor mn a la matriz. Por favor, vea el siguiente ejemplo de detalle:

 #include #include struct db{ int db_num; char db_name[10]; }; int main() { struct db *ptr; ptr = (struct db*)malloc(sizeof(struct db)); ptr->db_num = 10; ptr->db_name = "xyz"; printf("Input data Base:\n"); printf("db_num:%d db_name:%s",ptr->db_num,(char*)ptr->db_name); return 0; } 

En el fragmento de código anterior, estoy tratando de asignar “XYZ” a la matriz que es el miembro de struct db. A través del error similar debido a ptr-> db_name = “xyz”;

st_dyna_mem.c: 14: error: tipos incompatibles al asignar el tipo ‘char [10]’ del tipo ‘char *’

Solución: Para solucionar este tipo de problema, puede usar strcpy () o memcpy (). EX:

 #include #include #include struct db{ int db_num; char db_name[10]; }; int main() { struct db *ptr; ptr = (struct db*)malloc(sizeof(struct db)); ptr->db_num = 10; strcpy(ptr->db_name,"xyz"); printf("Input data Base:\n"); printf("db_num:%d db_name:%s",ptr->db_num,(char*)ptr->db_name); return 0; } 

Salida: db_num: 10 db_name: xyz