用c语言排列操作代码解释

时间:2017-11-01 15:00:32

标签: c pointers queue malloc

这是队列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分配任何东西,我们如何与内存指针进行比较?我认为这是检查器队列是否已满。

非常感谢..

+)现在我理解了代码....有人也可以回答这个问题吗?在什么情况下内存分配失败?

2 个答案:

答案 0 :(得分:1)

正在检查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被认为是零,!NULL是非零的,C中的任何非零都被认为是true

相同的代码可以这样写: -

QUEUE_NODE *newPtr = malloc(sizeof(QUEUE_NODE)));
if(newPtr == NULL ){
   return false;
}

答案 1 :(得分:0)

正在检查malloc()是否成功。如果它返回NULL,则语句将评估为false,并触发return false

从逻辑上讲,这里有一个简单的细分方法:

步骤1:malloc()无法分配内存并返回NULL,因此表达式现在是这样的:

if (!(newPtr = NULL))
    return false;

步骤2:分配newPtr,并使用其指定值:

if (!(NULL))
    return false;

第3步:这是人们喜爱或讨厌的一些基本知识。在C中,任何评估为零的内容都被视为逻辑false,而任何非零值都会在逻辑上true进行评估。 NULL相当于零,这意味着它在逻辑上等同于false

if (!(false))
    return false;

第4步:!(逻辑NOT运算符)将false翻转为true

if (true)
    return false;

通过这些步骤,如果malloc()返回评估为NULL的{​​{1}},并且false(逻辑NOT)将整个表达式更改为! 。这反过来导致函数返回true,表示失败。

编辑:要回答您的其他问题:如果您尝试分配太多内存,false将返回NULL,例如超出系统可用和/或超过系统允许的范围。继续尝试。运行一个循环,重复分配内存而不释放它,它最终将返回NULL。