Ошибка: несовместимые типы при назначении типа ‘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 предназначено для хранения строки с strcpy , используйте 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-элементный массив char »; поскольку он не был операндом операторов sizeof или унарных & , он был преобразован в тип char * . map[i].n не был преобразован (он остался типом char [25] ), но, как я сказал ранее, выражения массива могут быть не мишенью оператора присваивания.

Переменные массива не могут быть lvalue для оператора присваивания, то есть им нельзя назначить что-либо.

Чтобы скопировать массив, скопируйте элемент по элементу или используйте функцию «низкого уровня», например memcpy() чтобы скопировать определенный объем памяти одновременно:

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

Сначала вам нужно выделить память для map .

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

и используйте strcpy для копирования mn в 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 напрямую 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; } 

В приведенном выше fragmentе кода я пытаюсь назначить «XYZ» массиву, который является членом struct db. Это через аналогичную ошибку из-за ptr-> db_name = “xyz”;

st_dyna_mem.c: 14: ошибка: несовместимые типы при назначении типа ‘char [10]’ из типа ‘char *’

Исправление: для исправления этого типа проблемы вы можете использовать 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