为什么这个C代码将本地结构视为指针,当它看起来不是指针时?

时间:2014-02-02 20:47:26

标签: c pointers struct

在下面的代码中,“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的定义和新调用的东西:

#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);

1 个答案:

答案 0 :(得分:3)

在上面的代码段中,T stk会将stk声明为T类型的变量。但是,类型T未在任何地方定义,代码将无法编译。

如果它改为struct T stk;,则将stk声明为具有类型struct T的变量。但是,取消引用stk的尝试将毫无意义,代码将再次无法编译。

要使示例正常工作,您可以添加类似

的内容
typedef struct T *T

T类型定义为pointer to struct T。我会发现这非常令人困惑。