繁体   English   中英

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

[英]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; 有效的陈述?

headtail不是struct element一部分。 headtailqueue_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

“有效队列元素”的定义是什么? 如果它“有足够的空间来保存队列元素并且保存头指针和尾指针的位置具有有效值”,则将它们设置为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分配了一个有效的内存空间来指向。 但是,存储在该内存空间中的值可能是垃圾。 因此,指向nodenum_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的数据成员headtail应该指向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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM