Назначение массивов внутри структуры новой структуре с массивами - PullRequest
0 голосов
/ 11 июня 2018

Итак, у меня есть структура с массивами внутри, например:

struct struct1 {
unsigned char   data1[32];
unsigned char   data2[32];
char   *id;
};

и вторая структура, определенная как

typedef struct
{
   uint8_t id;  
   uint8_t data1[32]; 
   uint8_t data2[32]; 
} struct2;

Struct1 с данными уже внутри, она передается мне черезтакая функция:

bool func1(struct struct1 * const struct1)

и мне нужно создать NEW struct2 и передать в нее все данные из struct1.

Я думал, что мог бы просто назначить указатели следующим образом:

struct2 *new_struct;

new_struct->id = struct1->id;
new_struct->data1 = struct1->data1;
new_struct->data2 = struct1->data2;

, но я думаю, что указатели на массивы в C нельзя изменить (или, по крайней мере, это то, что я получил, прочитав их).

Итак, как мне создать новый struct2 и передать нужные мне данные из struct1?

1 Ответ

0 голосов
/ 11 июня 2018

указатели массива в C не могут быть изменены

Не существует такого понятия, как "указатель массива".Либо у вас есть массив, либо указатель.

В вашем случае data1 и data2 являются массивами, поэтому указатель, который вы могли бы переназначить, отсутствует.Ваш единственный выбор - скопировать данные, хранящиеся в массивах, из одной структуры в другую.

Вы можете использовать простое присваивание (=) между структурными переменными одного типа, но в вашем случае у вас разныетипы, так что вам нужно скопировать каждого члена в отдельности.Самый простой способ сделать это - использовать memcpy (из <string.h>).

#include <string.h>

// ...
struct2 new_struct;

new_struct.id = *struct1->id;
memcpy(new_struct.data1, struct1->data1, sizeof new_struct.data1);
memcpy(new_struct.data2, struct1->data2, sizeof new_struct.data2);

Примечания:

  • new_struct здесь не указатель.В вашем примере вы разыменовываете неинициализированный указатель с неопределенным поведением.
  • Я разыменовал struct1->id, потому что struct2.id - это единственный char, а не указатель.Я предполагаю, что это то, что вы хотите, чтобы это произошло.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...