[英]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
它定義類型T
為pointer to struct T
的pointer to struct T
。 我會發現這很令人困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.