簡體   English   中英

為什么這個包含指向自身的指針的結構無法正常工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM