Копирование массивов структур в C

Я давно не пользуюсь языком C, и это сводит меня с ума. У меня есть массив структур, и мне нужно создать функцию, которая будет копировать один массив в другой (мне нужна точная копия), но я не знаю, как определить вызов функции. Я думаю, мне нужно использовать указатели, но когда я пытаюсь, это дает мне ошибку.

struct group{ int weight; int x_pos; int y_pos; int width; int height; }; struct group a[4]; struct group b[4]; copySolution(&a, &b); 

Это последнее объявление присылает мне сообщение об ошибке. Как я уже сказал, это было давно программирование на C, поэтому я немного потерял прямо сейчас 🙁

Это должно сделать это:

 memcpy(&b, &a, sizeof(a)); 

EDIT : Кстати: он сохранит копию a в b .

Как говорит Йоханнес Вейс, memcpy() – хорошее решение.

Я просто хочу указать, что вы можете копировать структуры как обычные типы:

 for (i=0; i<4; i++) { b[i] = a[i]; /* copy the whole struct a[i] to b[i] */ } 

У этого есть ощущение плохо выполняемого задания на маскарад … Во всяком случае, учитывая предопределенный формат вызова для copySolution в исходном посте, правильное определение copySolution будет выглядеть следующим образом

 void copySolution(struct group (*a)[4], struct group (*b)[4]) { /* whatever */ } 

Теперь внутри copySolution вы можете скопировать массивы любым способом, который вы предпочитаете. Либо используйте цикл

 void copySolution(struct group (*a)[4], struct group (*b)[4]) { const struct group *pb, *pbe; struct group *pa; for (pa = *a, pb = *b, pbe = pb + sizeof *b / sizeof **b; pb != pbe; ++pa, ++pb) *pa = *pb; } 

или использовать memcpy как предложено выше

 void copySolution(struct group (*a)[4], struct group (*b)[4]) { memcpy(b, a, sizeof *b); } 

Конечно, вы должны решить, в каком направлении вы хотите скопировать ваши массивы. Вы не предоставили никакой информации, поэтому все просто подходили к какому-то выводу.

В моем случае предыдущие решения работали неправильно! Например, решение @Johannes Weiß не копировало «достаточно» данных (оно копировало около половины первого элемента).
Поэтому на случай, если кто-то нуждается в решении, которое даст вам правильные результаты, вот оно:

 int i, n = 50; struct YourStruct *a, *b; a = calloc(n, sizeof(*a)); b = malloc(n * sizeof(*b)); for (i = 0; i < n; ++i) { // filling a } memcpy(b, a, n * sizeof(*a)); // <----- see memcpy here if (a != NULL) free(a); a = calloc(n*2, sizeof(*a)); memcpy(a, b, n * sizeof(*b)); // <------ see memcpy here again 

В некоторых заметках я использовал calloc для a, потому что в части «// fill» я выполнял операции, требующие инициализированных данных.

Компилятор не имеет информации о размере массива после передачи их в качестве указателя на функцию. Поэтому вам часто нужен третий параметр: размер массивов для копирования.

Решение (без проверки ошибок) может быть:

 void copySolution(struct group* a, struct group* b, size_t size) { memcpy(a, b, size * sizeof(*a)); } 

Самый простой способ – это, вероятно,

  b=a 

хотя решение с memcpy() также будет работать.