Я пытаюсь присвоить значениям структуры карте, но после компиляции появляется следующее сообщение об ошибке:
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