我有一个类型node
,其指针在另一个结构中使用,如下所示。
typedef struct element {
void* data;
struct element *next;
} node;
typedef struct queue {
node *tail;
node *head;
int num_items;
} queue_t;
我使用以下代码创建一个空队列,但我不确定head和tail是否应该设置为NULL,因为temp还没有指向任何地方。
queue_t *temp;
temp = malloc(sizeof(queue_t));
if (temp == NULL){
return NULL;
}
temp->head = NULL;
temp->tail = NULL;
temp->num_items = 0;
根据我的理解,malloc
只会指向某个地址空间,其大小等于struct queue_t
的大小。地址空间尚未包含有效的队列元素。那么 temp->head = NULL;
和temp->tail = NULL;
的有效陈述怎么样?
有人可以解释为什么这有效吗?
答案 0 :(得分:2)
地址空间尚未包含有效的队列元素。
正确,分配的内存仅包含queue_t
那么temp-> head = NULL怎么样;和temp-> tail = NULL;有效的陈述?
head
和tail
不属于struct element
。 head
和tail
是queue_t
的一部分。您已分配queue_t
,因此可以为head
和tail
分配值。在这种情况下,您指定NULL值以显示它们不指向任何有效的值。
当您分配node
(又名结构元素)时,您更新head
和tail
,如:
// Add first node
temp->head == malloc(sizeof(node));
temp->tail == temp->head;
if (temp->head == NULL){
return NULL;
}
temp->num_items = 1;
// Initialize the new node
temp->head->next = NULL;
temp->head->data = NULL;
// Note: Adding more node requires more complex code
答案 1 :(得分:0)
"有效队列元素"的定义是什么?如果它有足够的空间来容纳队列元素,并且保持头部和尾部指针的位置具有有效值",则将它们设置为NULL
使其有效。如果不是那样,它是什么?
答案 2 :(得分:0)
根据我的理解,
malloc
只会对某些人提出临界点 地址空间,其大小等于struct queue_t
的大小。
正确。
地址空间尚未包含有效的队列元素。
不确定你的含义是什么"有效",但该陈述也是正确的。
那么temp-> head = NULL怎么样;和temp-> tail = NULL;有效的陈述?
正是这些语句使您分配的空间成为有效的队列元素!
有人可以解释为什么会有效吗?
您的问题从根本上与int i;
之类的陈述没有什么不同。您的实现留出了一个空格来保存整数。但是,它仍然无效,因为您没有给它任何(有意义的)值。设置i = 0;
或i = 42;
后,您调用i
的空间现在是一个有效的整数。
希望有所帮助。
答案 3 :(得分:0)
根据我的理解,malloc只会将临界点指向一个大小等于struct queue_t大小的地址空间。
malloc
函数调用将地址返回到malloc
函数调用的参数(以字节为单位)中指定的已分配内存的开头。分配的内存空间的大小将在malloc
的参数中指定。但是,malloc
返回的地址将是该内存空间的开头。因此,您可以使用指向该内存空间的指针安全地访问最大内存空间大小。
地址空间尚未包含有效的队列元素。
C标准库为指针变量temp
分配了一个有效的内存空间来指向。但是,存储在该存储空间中的值可能是垃圾。因此,指向node
中具有一些有效内存空间的num_items
和queue_t
数据成员的指针可能具有垃圾值。例如,在为queue_t
分配内存后,您可以尝试使用num_items
函数打印printf
的值。
queue_t *temp = malloc(sizeof(queue_t));
if (temp == NULL){
return NULL;
}
printf("The value of num_items: %d\n", temp->num_items);
以上示例可能会打印任何垃圾值。由于C language
没有构造函数来初始化新创建的变量,因此您应该使用一些稳定的值初始化您创建的每个变量。
您还可以使用calloc
函数调用,在分配内存空间后,还会将分配的内存设置为zero
。
那么temp-> head = NULL怎么样;和temp-> tail = NULL;有效的陈述?
内存由malloc
分配,可能包含任何垃圾值。 queue_t
的数据成员共享该内存空间。由于内存空间可能有垃圾数据,因此数据成员将拥有任何随机垃圾数据。这就是为什么将data members
分配的malloc
结构初始化为某些稳定值的好方法。这就是你在程序中所做的。
实际上,temp
的数据成员head
和tail
应指向node
类型的变量的地址。 malloc
来电已分配pointer variables
。这些指针变量可以指向node
类型的任何变量(或存储类型为node
的变量的地址)。但是您尚未分配任何node
变量,并且您不想创建dangling pointer
。因此,您应该使用pointer variables
初始化这些NULL
。
您的程序应如下所示:
queue_t *temp;
temp = malloc(sizeof(queue_t));
if (temp == NULL){
return NULL;
}
temp->head = NULL;
temp->tail = NULL;
temp->num_items = 0;
//Allocate some node
node *n = malloc(sizeof(node));
int data = 1;
n->data=&data;
n->next=NULL;
temp->head=n;
temp->tail=n;
temp->num_items=1;