我是Queue ADT,我在“排队”部分有个问题。。

//Queue ADT Type Defintions
    typedef struct node
        {
        void* dataPtr;
        struct node* next;
        } QUEUE_NODE;
    typedef struct
        {
        QUEUE_NODE* front;
        QUEUE_NODE* rear;
        int count;
        } QUEUE;
//Prototype Declarations
    QUEUE* createQueue (void);
    QUEUE* destroyQueue (QUEUE* queue);
    bool dequeue (QUEUE* queue, void** itemPtr);
    bool enqueue (QUEUE* queue, void* itemPtr);
    bool queueFront (QUEUE* queue, void** itemPtr);
    bool queueRear (QUEUE* queue, void** itemPtr);
    int queueCount (QUEUE* queue);
    bool emptyQueue (QUEUE* queue);
    bool fullQueue (QUEUE* queue);
//End of Queue ADT Definitions


bool enqueue (QUEUE* queue, void* itemPtr)
{
//Local Definitions
QUEUE_NODE* newPtr;
//Statements
if (!(newPtr =
    (QUEUE_NODE*)malloc(sizeof(QUEUE_NODE))))
    return false;

newPtr->dataPtr = itemPtr;
newPtr->next = NULL;
if (queue->count == 0)
// Inserting into null queue
    queue->front = newPtr;
else
    queue->rear->next = newPtr;

(queue->count)++;
queue->rear = newPtr;
return true;
} // enqueue

在这里,我想知道
!(newPtr =
(QUEUE_NODE*)malloc(sizeof(QUEUE_NODE)))

这意味着。。。
我知道malloc创建动态内存,但我们还没有为newPtr分配任何内容,我们如何与内存指针进行比较??我假设这是检查队列是否已满的检查程序。
谢谢。。
+)现在我明白了有人也能回答这个问题吗在什么情况下内存分配会失败?

最佳答案

它正在检查malloc是否失败不是链表的问题为了给你一个味道,我给你展示了一个分配n个存储int的内存位置的例子。

int *p = malloc(sizeof(int)*n);
if( p == NULL )
{
    fprintf(stderr,"%s","error");
    exit(1);
}

在本例中,当不能分配表示排队操作失败的信息时,它返回false。
也不需要铸造malloc别这样-这是不好的做法。
也可以在处理完分配的内存后分配free它这样可以避免内存泄漏,
free(p);
p=NULL;

线切割:-
!(newPtr =
(QUEUE_NODE*)malloc(sizeof(QUEUE_NODE)))

赋值表达式的值是赋值本身因此,如果此分配返回NULL!NULL将是if块中的条件这将是真的,意味着malloc已失败,将不会执行排队操作(空被认为是零,!NULL是非零的,而C中的任何非零都被认为是true
同样的代码可以这样写:-
QUEUE_NODE *newPtr = malloc(sizeof(QUEUE_NODE)));
if(newPtr == NULL ){
   return false;
}

10-08 09:38
查看更多