![](/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.