这是队列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分配任何东西,我们如何与内存指针进行比较?我认为这是检查器队列是否已满。
非常感谢..
+)现在我理解了代码....有人也可以回答这个问题吗?在什么情况下内存分配失败?
答案 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。