в первую очередь я начал изучать информатику, а 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. Надеюсь, это не было слишком запутанным?
Я пытался найти проблему, но на самом деле также не знаю, как ее искать. Я пробовал «вызывать данные из одной структуры через другую» и подобные вещи, но не смог получить ответ. Буду признателен за любую помощь, спасибо!
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;