Доступ к данным через структуру один для структуры два?

в первую очередь я начал изучать информатику, а C — основной язык. В первые дни я узнал, что нужно много «работать ногами», чтобы что-то делать на C. Прямо сейчас мы работаем со связанными списками, и у меня есть упражнение, которое я хотел бы закончить. Итак, я был бы очень рад, если бы некоторые из вас, ребята, могли взглянуть на мою проблему и дать несколько советов о том, как решить эту проблему.

Если вы все еще читаете это, вот моя проблема:

У нас получилось 2 структуры:

typedef struct MsgDetails {
char *id;
msgtag tag;
int year;
int month;
int day;
} MsgDetails;

typedef struct Node {
void *item;
struct Node *next;
} Node;

и это функция:

struct Node* addMsgDetails(Node* head ,MsgDetails *MsgDetaillos) {
int tag = 0, year = 0, month = 0, day = 0;
char id;

Node *current = head;

while (current->next != NULL) {
current = current->next;
}

current->next = malloc(sizeof(Node));
current->next->next = NULL;
current->next->item = malloc(sizeof(MsgDetails));

printf("\nenter msg metadata (tag,year,month,day,id):");
scanf(" %d, %d, %d, %d, %40s", &tag, &year, &month, &day, &id);

MsgDetaillos->tag = tag;
MsgDetaillos->year = year;
MsgDetaillos->month = month;
MsgDetaillos->day = day;
MsgDetaillos->id = &id;

return current;
}

Итак, проблема в том, что я знаю, что мне нужно выделить память для каждой структуры, когда я хочу добавить новую структуру. Я перебираю свою структуру узла, пока не достигну узла с NULL в следующем указателе. Теперь, когда я на правильном узле, я также добавляю адрес выделенной памяти в указатель void *item, но теперь я не знаю, как добавить информацию о структуре Msg Details в переменную item. Надеюсь, это не было слишком запутанным?

Я пытался найти проблему, но на самом деле также не знаю, как ее искать. Я пробовал «вызывать данные из одной структуры через другую» и подобные вещи, но не смог получить ответ. Буду признателен за любую помощь, спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Вы назначите члену структуры буфер, заполненный данными, вместо неинициализированного буфера.
  • char не может содержать строку положительной длины. Вам нужно будет выделить буфер для строк.

Вместо этого

current->next->item = malloc(sizeof(MsgDetails));

printf("\nenter msg metadata (tag,year,month,day,id):");
scanf(" %d, %d, %d, %d, %40s", &tag, &year, &month, &day, &id);

MsgDetaillos->tag = tag;
MsgDetaillos->year = year;
MsgDetaillos->month = month;
MsgDetaillos->day = day;
MsgDetaillos->id = &id;

Вы должны использовать это:

// allocate buffer for data
MsgDetails* data = malloc(sizeof(MsgDetails));
// allocate buffer for string
char* id_str = calloc(41, sizeof(char));

// check results of malloc() and calloc() here fore better safety

printf("\nenter msg metadata (tag,year,month,day,id):");
scanf(" %d, %d, %d, %d, %40s", &tag, &year, &month, &day, id_str);

// fill the buffer with data read
data->tag = tag;
data->year = year;
data->month = month;
data->day = day;
data->id = id_str;

// assign the buffer to the member of the structure
current->next->item = data;

Другие вопросы по теме