Я пытаюсь перебрать содержимое потока, чтобы динамически генерировать узлы в списке, учитывая содержимое каждой строки, которую я читаю. У меня есть структура, которую я определил ниже:
struct info {
char *mystring;
char *file;
int line_no;
struct info *next;
};
Я использую этот цикл для итерации по потоку:
while(1) {
char t [KMAX];
char* file;
char* line_no;
char* text;
if (fgets(t, KMAX, file_pipe) != NULL) {
file = strtok (t, delimiter);
line_no = strtok(NULL, delimiter);
int line = atoi(line_no);
text = strtok(NULL, delimiter);
add(&head, text, line, file);
}
Я знаю, что переменные правильно передаются в мою функцию добавления, потому что я распечатываю их каждый раз и могу это проверить. Однако проблема возникает, когда я пытаюсь распечатать список. Он просто печатает последнюю строку текста и имени файла, но целочисленное значение изменяется соответственно. Я предполагаю, что это как-то связано с уничтожением и повторным созданием массива каждый раз в одном и том же блоке памяти, поэтому указатели меняются каждый раз.
Я не уверен, каков правильный метод решения этой проблемы. Должен ли я каким-то образом изменить цикл while и использовать указатели на символы другим способом, или мне следует каким-то образом изменить структуру, чтобы она содержала переменные, вместо того, чтобы просто использовать указатели? Буду признателен за любые отзывы!
РЕДАКТИРОВАТЬ: добавлено больше кода
void add(struct info **x, char * text, int line_no, char * file) {
struct info* current = *x;
struct info* newInfo;
newInfo = malloc(sizeof(struct info));
(*newInfo).next = NULL;
(*newInfo).grepstring = text;
(*newInfo).line_no = line_no;
(*newInfo).file = file;
if (current == NULL) { //indicates the head is null, special case
*x = newInfo;
} else {
//get to the end of the list
while ((*current).next != NULL) {
current = (*current).next;
}
//apends node to the end of the list
(*current).next = newInfo;
}
}