错误:从类型’char *’分配类型’char ‘时出现不兼容的类型

我正在尝试将结构的值分配给地图,但编译后会出现以下错误消息:

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

 map[i].n=mn 

我的结构是这样定义的:

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

我的部分代码:

  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; 

数组表达式可能不是赋值的目标; =运算符未定义为将一个数组的内容复制到另一个数组。

如果n意味着保存以0结尾的字符串,请使用strcpy

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

如果n意味着保存非0终止的字符串(或嵌入0值的字符序列),请使用memcpy

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

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则“N元素数组T ”的表达式将被转换(“衰减”)为表达式“指向T指针”,表达式的值将是第一个元素的地址。

这就是你收到错误信息的原因; 表达式mn具有类型“25-element array of char ”; 因为它不是sizeof或一元&运算符的操作数,所以它被转换为char *类型。 map[i].n没有转换(它保留了char [25]类型),但正如我之前所说,数组表达式可能不是赋值运算符的目标。

数组变量不能是赋值运算符的左值 ,也就是说它们不能被赋值。

要复制数组,请逐个元素复制或使用“低级”函数(如memcpy()一次复制特定数量的内存:

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

首先,您需要为map分配内存。

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

并使用strcpymn复制到map->n

 struct m1 *map; 

map是一个指针,你应该在向它写入内容之前为它分配内存。

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

然后你就可以拥有

 map[i] 

在此修复字符串副本后

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

看起来你最想做的事情(除了为结构分配内存)是复制n指向的数组的内容,而不是只复制实际的指针。

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

您复制所有结构成员。 最简单的方法是:

 map[i]=m; 

看起来您正在尝试将mn值直接分配给数组。 请看下面的详细示例:

 #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; } 

在上面的代码片段中,我试图将“XYZ”分配给作为struct db成员的数组。 它通过类似的错误,因为ptr-> db_name =“xyz”;

st_dyna_mem.c:14:错误:从类型’char *’分配类型’char [10]’时出现不兼容的类型

修复:对于修复此类问题,您可以使用strcpy()或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; } 

输出:db_num:10 db_name:xyz