我剛開始學習 C,如果命名不正確,請原諒我。
如果我將 a 分配struct給 astruct pointer然后更改 struct 的值,那么當我嘗試從struct pointer.
struct Node_int *new_node_address = (struct Node_int *) malloc(sizeof(struct Node_int));
struct Node_int new_node_instance;
*new_node_address = new_node_instance;
new_node_instance.data = data;
new_node_instance.next= NULL;
printf("%d", new_node_address->data)
這里printf("%d", new_node_address->data)將回傳一個垃圾值,但以下代碼中的相同列印陳述句將回傳正確/分配的資料。
struct Node_int *new_node_address = (struct Node_int *) malloc(sizeof(struct Node_int));
struct Node_int new_node_instance;
new_node_instance.data = data;
new_node_instance.next= NULL;
*new_node_address = new_node_instance;
printf("%d", new_node_address->data)
我想了解為什么會這樣。是否*new_node_address獲取new_node_instance記憶體中的復制值?
uj5u.com熱心網友回復:
我想了解為什么會這樣。是否
*new_node_address獲取new_node_instance記憶體中的復制值?
是的,確實有,有一個副本,取消參考運算子*意味著您正在將資料復制到 . 指向的記憶體地址new_node_address。哪個是回傳的記憶體塊malloc。
如果你想讓指標指向宣告的地址new_node_instance,你需要:
new_node_address = &new_node_instance;
在這種情況下,不會發生復制,因此您也不需要分配記憶體,您正在使指標指向一個已經具有記憶體存盤的變數。
第二個代碼片段有效的原因是因為您在分配資料后制作副本,而不是第一個代碼片段。
uj5u.com熱心網友回復:
對于初學者來說,似乎有一個錯字
new_node_instance.data = data;
new_node_instance.data= NULL;
那就是使用相同的資料成員data。似乎第二個資料成員被命名為nextor link。
如果我將一個結構分配給一個結構指標,然后更改結構的值,那么當我嘗試從結構指標訪問該值時,它不會反映出來。
這是因為指標指向另一個動態分配的單獨物件。
您首先需要為物件分配值new_node_instance,然后將結構型別的物件分配給動態分配的物件,例如
new_node_instance.data = data;
new_node_instance.next = NULL;
*new_node_address = new_node_instance;
或者
struct Node_int new_node_instance = { .data = data, .next = NULL };
*new_node_address = new_node_instance;
即在分配結構型別的物件時,資料成員的值被復制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419655.html
標籤:
上一篇:GoogleApps腳本中關于日期和時間的時間觸發器
下一篇:條件即使不是也回傳True
