Бесконечный цикл при печати

#c #linked-list

#c #связанный список

Вопрос:

Во-первых, я новичок в C и попал в программу, в которой я должен использовать C. Теперь я считаю, что моя проблема как-то связана с указателем, но когда я пытаюсь распечатать список (чтобы убедиться, что я сохранил его в правильном порядке, моя программа вылетает после второговремя прохождения цикла.

Это моя функция вставки, которая вставляется с наименьшим необходимым временем, и я считаю, что это правильно, но не смог протестировать ее, так как мой сбой печати

 void insertProcess(Processamp; process, Process* amp;head, Process* curr, Process* prev){
curr = head;
if(head == NULL){
    head = amp;process;
}
else{
    prev = head;
    while(process.timeNeeded > curr->timeNeeded){
        prev = curr;
        curr = curr->next;
    }
    prev->next = amp;process;
    process.next = curr;
}
}
 

Вот мой простой цикл, который должен распечатать список. Это будет выполняться несколько раз, прежде чем указать «местоположение чтения с нарушением доступа»

 while(curr->next != NULL){
    printf("%s %i %i %in", process.processName, process.arrivalTime,     process.timeNeeded, process.priority);
    curr = curr->next;
}
 

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

РЕДАКТИРОВАТЬ: ХОРОШО, с помощью первого плаката я исправил исходную проблему, но теперь у меня бесконечный цикл при печати. Я почти уверен, что это было бы потому, что я вставляю по порядку и никогда не устанавливаю нулевой указатель после последнего элемента. Кажется ли это правильным, и если да, есть ли какой-либо способ это исправить? Еще раз спасибо

Комментарии:

1. Process *amp;head не является законным c. Вы не можете передавать по ссылке.

2. Вы компилируете это с помощью компилятора c ?

3. На самом деле я, это то, с чем я был знаком и что делал мой класс, поскольку у нас не было ни знаний о C, ни времени на его изучение. Настоящая причина, по которой мы использовали C, заключалась в том, чтобы мы не использовали объектно-ориентированные свойства c . И я знал, что это казалось неправильным, когда я это делал, но head сбрасывался каждый раз, когда я вызывал insert, если есть другой способ сделать это, я с радостью это исправлю.

4. В c вы бы передали head как Process **head . Затем вы могли бы использовать (*head)->field , и *head = newhead . Таким образом, компилятор c примет его.

Ответ №1:

В вашей функции вы передаете Process значение by, и это означает, что функция будет работать с локальной копией Process объекта, которая будет уничтожена при завершении функции.

Однако ваш код связывается в этой локальной копии, и поэтому, как только вы выходите из функции, ваш связанный список теперь использует Process объект, который уже был уничтожен.

Другая проблема заключается в том, что при циклическом поиске точки вставки вы не учитываете случай, когда вставленный процесс может быть последним и в этом случае curr станет нулевым в цикле.

Комментарии:

1. Спасибо, что исправлена одна проблема, которую я должен был увидеть. Теперь я получаю бесконечный цикл, печатающий только последний элемент, который я вставил, но, возможно, я смогу найти проблему с ним.

Ответ №2:

Вы должны научиться использовать отладчик. В Linux вы должны скомпилировать оба -g (чтобы получить отладочную информацию, созданную компилятором) и -Wall (чтобы получить все предупреждения), переданные в gcc или g . Затем вы можете использовать gdb отладчик для своего исполняемого файла.