Увеличение целочисленного указателя в цикле на C - PullRequest
0 голосов
/ 07 октября 2018

Мой исходный код для отображения узлов в очереди в порядке от низшего к наибольшему:

void display (queue *q) {
node *ptr = q->front;
int i = 0;
int size = q->size;
while (i <= size) {
    while (ptr->id != i) {
        ptr = ptr->next;
    }
    if (i == 0) {
        printf("%d ", ptr->id);
        printf("%d\n", ptr->running);
    }
    else {
        printf("%d ", ptr->id);
    }
    i++;
    ptr = q->front;
}

}

Продолжал выдавать ошибки Segmentation Fault (Core Dumped).У меня есть malloc две сравниваемые переменные, и эта ошибка была исправлена.

void display (queue *q) {
node *ptr = malloc(10);
ptr = q->front;
int *i = NULL;
i = malloc(sizeof(int));
*i = 0;
int size = q->size;
while(*i <= size){
    while (ptr->id != *i) {
        ptr = ptr->next;
    }
    if (*i == 0) {
        printf("%d %d\n", ptr->id, ptr->running);
    }
    else {
        printf("%d %d %d %d\n", ptr->id, ptr->running, ptr->ready, ptr->blocked);
    }
    i = i + 1 * (sizeof(char));
    ptr = q->front;
}

}

Однако теперь это не дает желаемого результата.Я хочу увеличить указатель i, чтобы он мог совпадать с исходным кодом.

Это было очень неприятно, любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 07 октября 2018

Если я правильно прочитал ваш первый список кодов, здесь нужно подумать хотя бы об одной важной вещи.Похоже, у вас есть связанный список, и вы перебираете этот список, используя ptr = ptr->next.Это означает, что вам нужно знать, когда остановиться.Один из распространенных способов настройки связанного списка состоит в том, что последний элемент в списке имеет значение next, равное NULL.Затем обрабатывайте узлы по одному, и как только вы закончите работу с одним узлом, вы проверяете, является ли значение next NULL: если это не так, вы можете перейти на этот следующий узел, если это NULL вы останавливаетесь.

Здесь вы не проводите подобные проверки, поэтому вам нужен другой способ убедиться, что вы знаете, когда остановиться.Похоже, что вы делаете, берете значение q->size и используете его, чтобы сообщить вам, сколько элементов есть в связанном списке.Итак, первое, о чем нужно подумать, это насколько вы уверены, что это значение верно.Например, если код, строящий список, помещает в список только два элемента, ставка устанавливает size на три, в конечном итоге вы выпадаете из конца списка, и ошибка сегментации весьма вероятна.

Но есть нечто даже более важное, чем это.Даже если вы получаете правильное количество элементов в списке от q->size, вы сравниваете переменную цикла i с size следующим образом:

int i = 0;
while (i <= size) {
  ⋮
}

Это будет циклс i, имеющим значения [0, 1,… size], что на самом деле size + 1 раз.Если вы хотите выполнить цикл ровно size раз, вам нужен тест, подобный i < size, а не i <= size.Это распространенная ошибка, часто называемая ошибкой off-by-one .

К сожалению, ваш второй список усложняет, а не делает их лучше.Вернитесь к первому и посмотрите, сможете ли вы починить вещи, о которых я здесь упоминал.

...