Очередь Dynami c Array - PullRequest
       1

Очередь Dynami c Array

0 голосов
/ 06 апреля 2020

Я изучаю очередь в c и пытаюсь создать базовую c программу очереди. Но не удалось выделить память для моего массива. Вот мое объявление очереди и моя функция createqueue. После выделения памяти для myQueue я должен выделить для массива также, но я не знаю, как. Должен ли я просто набрать myQueue->array =(myQueue)malloc(sizeof(myQueue)); это будет работать?

struct QueueRecord
{
    int capacity;
    int front;
    int rear;
    int size;
    int *array;
};

typedef struct QueueRecord *Queue;





Queue CreateQueue(int maxElements)
{
    Queue myQueue;
    if (maxElements<MIN_QUEUE_SIZE)
    {
        printf("Queue is too small\n");
        return;
    }
    myQueue = (Queue*)malloc(sizeof(Queue));
    if (myQueue == NULL)
        printf("out of memmory space");
    myQueue->array =(myQueue)malloc(sizeof(myQueue));
    myQueue->capacity=maxElements;
    MakeEmptyQueue(myQueue);
    return myQueue;
    }

1 Ответ

0 голосов
/ 06 апреля 2020

Я должен выделить для массива также, но я не знаю, как

из-за строки

myQueue->capacity=maxElements;

лог c должен иметь

myQueue->array = malloc(sizeof(int) * maxElements);

Должен ли я просто набрать myQueue-> array = (myQueue) mallo c (sizeof (myQueue)); это будет работать?

только в случае, если sizeof (myQueue) больше sizeof (int) * maxElements , но вы только проверяете maxElements не слишком маленьким когда maxElements достаточно велико, поведение не определено (обычно, когда maxElements больше 6, когда размер указателя равен двойному размеру int ).


Из этого:

  • Плохая идея иметь typedef , определяющий указатель, лучше иметь указатели, явные в коде, чтобы увидеть их

  • первый возврат; должен быть return NULL;

  • зная myQueue is NULL, не разыменовывайте его после, вы можете напрямую вернуть NULL после того, как printf

  • при проверке первого mallo c не возвращается NULL, также для второго, обычно в том же , если

Например:

struct QueueRecord
{
    int capacity;
    int front;
    int rear;
    int size;
    int *array;
};

typedef struct QueueRecord Queue;

void MakeEmptyQueue(Queue *);

Queue * CreateQueue(int maxElements)
{
    Queue * myQueue;

    if (maxElements < MIN_QUEUE_SIZE)
    {
      printf("Queue/maxElements is too small\n");
      return NULL;
    }

    if (((myQueue = malloc(sizeof(Queue))) == NULL) ||
        ((myQueue->array = malloc(sizeof(int) * maxElements)) == NULL))
    {
      printf("out of memory space\n");
      free(myQueue); /* to avoid memory leak, no problem if myQueue is NULL */
      return NULL;
    }

    myQueue->capacity = maxElements;
    MakeEmptyQueue(myQueue);

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