![](/img/trans.png)
[英]Accessing elements within a pointer of a struct inside another pointer to a struct
[英]Accessing struct pointer within another struct in C
我有一个类型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
只会使 temp 指向某个大小等于struct queue_t
大小的地址空间。 地址空间尚不包含有效的队列元素。 那么temp->head = NULL;
和temp->tail = NULL;
有效的陈述? 有人可以解释一下为什么会这样吗?
地址空间尚不包含有效的队列元素。
正确,分配的内存只包含一个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
“有效队列元素”的定义是什么? 如果它“有足够的空间来保存队列元素并且保存头指针和尾指针的位置具有有效值”,则将它们设置为NULL
使其有效。 如果不是那个,那是什么?
根据我的理解,
malloc
只会使 temp 指向某个大小等于struct queue_t
大小的地址空间。
正确的。
地址空间尚不包含有效的队列元素。
不确定您所说的“有效”是什么意思,但该陈述也是正确的。
那么 temp->head = NULL; 和 temp->tail = NULL; 有效的陈述?
正是这些语句使您分配的空间成为有效的队列元素!
有人可以解释一下为什么会这样吗?
你的问题从根本上与int i;
类的语句没有什么不同int i;
. 您的实现留出了一个空间来保存一个整数。 然而,它仍然无效,因为你没有赋予它任何(有意义的)价值。 一旦你设置i = 0;
或i = 42;
,你称之为i
的空间现在是一个有效的整数。
希望有帮助。
根据我的理解,malloc 只会让 temp 指向某个大小等于 struct queue_t 大小的地址空间。
malloc
函数调用返回一个地址,该地址指向malloc
函数调用参数中指定大小的已分配内存的开头(以字节为单位)。 分配的内存空间的大小在malloc
的参数中指定。 但是, malloc
返回的地址将是该内存空间的开始。 因此,您可以使用指向该内存空间的指针安全地访问该内存空间的大小。
地址空间尚不包含有效的队列元素。
C 标准库已经为您的指针变量temp
分配了一个有效的内存空间来指向。 但是,存储在该内存空间中的值可能是垃圾。 因此,指向node
和num_items
数据成员的指针在queue_t
分配了一些有效的内存空间可能具有垃圾值。 例如,为queue_t
分配内存后,您可以尝试使用printf
函数打印num_items
的值。
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
的数据成员共享该内存空间。 由于内存空间可以包含垃圾数据,因此数据成员将包含任何随机垃圾数据。 这就是为什么将malloc
分配的结构的data members
初始化为一些稳定值是一种很好的方法。 这就是你在你的程序中所做的。
实际上, temp
的数据成员head
和tail
应该指向node
类型的变量的地址。 malloc
调用已分配pointer variables
。 这些指针变量可以指向node
类型的任何变量(或存储node
类型变量的地址)。 但是您还没有分配任何node
变量,并且您不想创建dangling pointer
。 因此,您应该使用NULL
初始化这些pointer variables
。
你的程序应该是这样的:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.