在C中的另一个结构中访问struct指针

时间:2016-09-20 04:22:13

标签: c pointers struct

我有一个类型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; 的有效陈述怎么样? 有人可以解释为什么这有效吗?

4 个答案:

答案 0 :(得分:2)

  

地址空间尚未包含有效的队列元素。

正确,分配的内存仅包含queue_t

  

那么temp-> head = NULL怎么样;和temp-> tail = NULL;有效的陈述?

headtail不属于struct elementheadtailqueue_t的一部分。您已分配queue_t,因此可以为headtail分配值。在这种情况下,您指定NULL值以显示它们不指向任何有效的值。

当您分配node(又名结构元素)时,您更新headtail,如:

// 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_itemsqueue_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的数据成员headtail应指向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;