簡體   English   中英

為什么在看起來好像不是指針的情況下,此C代碼為什么將局部結構視為指針?

[英]Why does this C code treat a local struct as a pointer, when it doesn't appear to be a pointer?

在下面的代碼中,“ stk”被視為指針。 但是從各個角度看了幾個小時之后,我終生看不到它是一個指針。 有人可以解釋我所缺少的嗎?

struct T {
    int count;
    struct elem {
        void *x;
        struct elem *link;
    } *head;
};

T Stack_new(void) {
    T stk;
    NEW(stk);
    stk->count = 0;
    stk->head = NULL;
    return stk;
}

我的解釋是T是一個結構,因此stk是一個包含結構的局部自動變量。 不是指針,但是隨后將其視為指針,這使我陷入了WTF狀態。

更多背景該代碼來自Hanson的一本書,名為“ C接口和實現”。 他創建了一個抽象數據類型庫,用於暴露接口並隱藏實現。 堆棧是他覆蓋的第一個堆棧。 我是一個長期的程序員,現在正在研究C,並且顯然有某種解析我所缺少的語法的方法。 謝謝。

如果相關,則這里是NEW的定義以及new調用的內容:

#define  NEW(p) ((p) = ALLOC((long)sizeof *(p)))

#define ALLOC(nbytes) \
    Mem_alloc((nbytes), __FILE__, __LINE__)

extern void *Mem_alloc (long nbytes,
    const char *file, int line);

在上面的代碼段中, T stk將stk聲明為類型T的變量。 但是T類型沒有在任何地方定義,並且代碼無法編譯。

如果改為說struct T stk; ,則將stk聲明為類型struct T的變量。 但是,取消引用stk的嘗試將毫無意義,並且代碼將再次無法編譯。

為了使示例正常工作,您可以添加以下內容:

typedef struct T *T

它定義類型Tpointer to struct Tpointer to struct T 我會發現這很令人困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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