[英]Why does this struct that contains a pointer to itself not work properly?
#include <stdio.h>
#include <stdlib.h>
typedef struct minion
{
int home;
struct minion *father;
} Minion;
main()
{
Minion *dummy = (Minion *)malloc(sizeof(Minion));
dummy->father = &dummy;
dummy->home = 0;
printf("%d %d %d", &dummy, dummy->father, (dummy->father)->father);
}
(dummy->father)->father
的價值為何與其他不同?
輸出為:
2424368 2424368 43
main()
這應該是int main(void)
。
{
Minion *dummy = (Minion *)malloc(sizeof(Minion));
更清楚,可靠地寫為:
Minion *dummy = malloc(sizeof *dummy);
...
dummy->father = &dummy;
dummy->home = 0;
沒關系。
printf("%d %d %d", &dummy, dummy->father, (dummy->father)->father);
您在這里遇到幾個問題。
dummy
是指針對象。 &dummy
是該指針對象的地址。 指針對象是在堆棧上分配的,沒有特別的原因要關心它的地址。
如果要打印分配的Minion
對象的地址,請將&dummy
更改為dummy
; 您需要指針對象的值 。
%d
僅用於打印int
類型的值,而不用於指針。 要打印指針值,請使用%p
,它需要一個類型為void*
的參數,因此通常,您必須在打印指針值之前將其轉換為void*
。 該行應如下所示:
printf("%p %p %p\n",
(void*)dummy,
(void*)dummy->father,
(void*)dummy->father->father);
請注意,我在行的末尾添加了\\n
,以便可以正確打印。 我還刪除了不必要的括號。
}
還有一點,與您的問題無關。 為每個struct
類型定義typedef
是很常見的-但這不是必需的。 我個人的喜好是忽略typedef
並通過其原始名稱引用結構類型-在這種情況下為struct minion
。 它更簡單(因為在完全定義類型之前更容易引用類型)。 它的類型更多,但是恕我直言,如果結構類型是明顯的結構,則代碼會更清晰。 (如果您希望類型為opaque ,則使用typedef是有意義的,因此使用該類型的代碼不知道它是結構。在此不做此操作。)
另一方面,許多C程序員更喜歡對結構使用typedef,因為它為單個標識符提供了類型名稱。 選擇一種風格並保持一致。
#include <stdio.h>
#include <stdlib.h>
typedef struct minion
{
int home;
struct minion *father;
} Minion;
main()
{
Minion *dummy = (Minion *)malloc(sizeof(Minion));
/* dummy->father = &dummy <== already a pointer */
dummy->father = dummy;
dummy->home = 0;
printf("%p %p %p", dummy, dummy->father, (dummy->father)->father);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.