簡體   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