为什么客户端在这种情况下不能取消引用指针?

时间:2014-11-18 02:21:45

标签: c pointers struct

我理解客户端可以在这种情况下操纵指向结构的指针,但不能取消引用它。我想知道为什么它不能被解除引用?

stack.h

#ifndef STACK_INCLUDED
#define STACK_INCLUDED

typedef struct Stack_T *Stack_T;

extern Stack_T stack_new(void);
extern int stack_empty( Stack_T p_stk );
extern void stack_push( Stack_T p_stk, void *p_data );
extern void *stack_pop( Stack_T p_stk );
extern void stack_free( Stack_T *p_stk );

#endif

stack.c

#include "stack.h"

struct Stack_T {
    int node_count;
    struct node {
        void *p_data;
        struct elem *p_link;
    } *p_head;
};

的main.c

#include "stack.h"

int main(void)
{
    Stack_T stk;
    ...
    return EXIT_SUCCESS;
}

更确切地说,为什么不能在主

中取消引用该对象

1 个答案:

答案 0 :(得分:3)

我假设“客户”是指“包含stack.h”的源文件。

原因是struct Stack_T文件中实际上未定义stack.h。它被声明,typedef确保编译器理解在某处定义struct Stack_T,但尚未定义。

stack.c是唯一需要知道内部 struct Stack_T是什么的模块,因此结构的定义在该文件中。

此代码的客户端不需要知道struct Stack_T内的内容,因此他们看不到定义。