Разыменование ошибок указателя - PullRequest
0 голосов
/ 20 декабря 2018

Ниже приведены файлы Lib.c и Lib.h, которые должны быть частью кода "кинотеатра", но я не могу заставить некоторые указатели работать вместе.

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

StackLib.h

#include <stdio.h>
#ifndef _STACKLIB_H
#define _STACKLIB_H

struct Node {
  char SeatRow;
  int SeatNumber;
  struct node *next_ptr;
}*StackTop;

void PushSoldSeat(struct Node **StackTop, char RowToAdd, int SeatToAdd);
void PopTickets(struct Node *StackTop);

#endif

.

#include "StackLib.h"
#include <stdio.h>
#include <stdlib.h>

void PushSoldSeat(struct Node **StackTop, char RowToAdd, int SeatToAdd) {
  struct Node *NewNode = malloc(sizeof(struct Node));
  NewNode->SeatRow = RowToAdd;
  NewNode->SeatNumber = SeatToAdd;

  if (*StackTop == NULL) {
    *StackTop = NewNode;
    NewNode->next_ptr = NULL;
  } else {
    NewNode->next_ptr = *StackTop; //line 20
    *StackTop = NewNode;
  }
}

void PopTickets(struct Node *StackTop) {
  struct Node *TempPtr;
  if (StackTop == NULL) {
    printf("Pop not executed - stack is empty\n\n");
    return;
  }
  while (StackTop != NULL) {
    StackTop = TempPtr;
    printf("\n______________\n");
    printf("\n|             |\n");
    printf("\n|   Seat %c%d   |\n", StackTop->SeatRow, StackTop->SeatNumber);
    printf("\n|             |\n");
    printf("\n______________\n");
    TempPtr = StackTop->next_ptr; //line 41
    free(StackTop);
  }
  return;
}

Когда я gcc, терминал печатает:

StackLib.c: In function ‘PushSoldSeat’:
StackLib.c:20: error: dereferencing pointer to incomplete type
StackLib.c: In function ‘PopTickets’:
StackLib.c:41: error: incompatible types in assignment

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Есть несколько проблем с кодом, во-первых, ошибка здесь

struct node *next_ptr;

, как указано @chux. Это должно быть struct Node *next_ptr;.

secondaly, в PopTickets() при печати struct Node информация, это

while (StackTop != NULL) { /* some code */ }

должно быть

struct Node *TempPtr = StackTop;
while (TempPtr != NULL) { /* some code */ }

, так как более ранний код создает ошибку ошибки сегментации.Предположим, что есть только один узел, тогда этот

TempPtr = StackTop->next_ptr;

делает TempPtr как NULL, но StackTop остается тем же и снова повторяет цикл (не должен), и этот StackTop = TempPtr; делает StackTop как NULL и при доступе к StackTop->SeatRow т.е. NULL->SeatRow происходит сбой.

Вот пример кода:

trevor.c

#include "StackLib.h"
#include <stdio.h>
#include <stdlib.h>
void PushSoldSeat(struct Node **StackTop, char RowToAdd, int SeatToAdd) {
        struct Node *NewNode = malloc(sizeof(struct Node));
        NewNode->SeatRow = RowToAdd;
        NewNode->SeatNumber = SeatToAdd;

        if (*StackTop == NULL) {
                *StackTop = NewNode;
                NewNode->next_ptr = NULL;
        }
        else {
                NewNode->next_ptr = *StackTop; //line 20
                *StackTop = NewNode;
        }
}

void PopTickets(struct Node *StackTop) {
        struct Node *TempPtr = StackTop;
        if(StackTop == NULL) {
                printf("Pop not executed - stack is empty\n\n");
                return;
        }
        while (TempPtr != NULL) {
                StackTop = TempPtr;
                printf("\n______________\n");
                printf("\n|             |\n");
                printf("\n|   Seat %c%d   |\n", StackTop->SeatRow, StackTop->SeatNumber);
                printf("\n|             |\n");
                printf("\n______________\n");
                TempPtr = StackTop->next_ptr; //line 41
                free(StackTop);
        }
}
int main(void) {
        struct Node *head = NULL;
        PushSoldSeat(&head,'a',5);
        PushSoldSeat(&head,'b',10);
        PushSoldSeat(&head,'c',15);
        PushSoldSeat(&head,'d',20);
        PopTickets(head);
        return 0;
}

StackLib.h

#include <stdio.h>
#include <stdlib.h>
#ifndef _STACKLIB_H
#define _STACKLIB_H

struct Node {
  char SeatRow;
  int SeatNumber;
  struct Node *next_ptr; /* avoid spell mistake */
}StackTop; /* *stackTop is not required */

void PushSoldSeat(struct Node **StackTop, char RowToAdd, int SeatToAdd);
void PopTickets(struct Node *StackTop);

#endif

Теперь скомпилируйте ваш код, как показано ниже

gcc -Wall -Wstrict-prototypes -Werror trevor.c
0 голосов
/ 20 декабря 2018

Капитализация важна для C. У вас есть struct Node, который вы определяете.Внутри у него есть указатель на другой тип, struct node, о котором компилятор ничего не знает.Вы должны использовать постоянную прописную букву, и она должна работать лучше

Кстати, я ожидаю, что gcc напечатает предупреждение в файле .h, где вы впервые ссылаетесь на новый struct node.Обязательно скомпилируйте с -Wall -Wextra -pedantic, чтобы он мог помочь вам обнаружить много ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...