- # cat a.c
- #include <stdio.h>
- #include "b.h"
- void main()
- {
- struct stb *pb;
- pb = set_b(1);
- printf("%d\n", pb->i);
- }
- # cat b.c
- #include <stdlib.h>
- #include "b.h"
- struct stb{
- int i;
- };
- struct stb *set_b(int num)
- {
- struct stb *pb = NULL;
- pb = (struct stb*)calloc(1, sizeof(struct stb));
- pb->i = num;
- return pb;
- }
- # cat b.h
- #ifndef __B_H
- #define __B_H
- struct stb *set_b(int i);
- #endif
- # gcc a.c b.c
- a.c: In function 'main':
- a.c:8: error: dereferencing pointer to incomplete type
所有信息如上,文件a.c中的代码printf
("%d\n", pb
->i
)试图访问pb指针内的数据,结果编译出错,提示pb指针指向的内存中未定义int i这个类型参数。给出指针地址,知道指针的类型,为什么访问不了里面的参数呢?首先来看看一个最简单的c代码:- # cat test.c
- void main()
- {
- struct fjcasfas *p;
- }
fjcasfas是随手敲出的代码,此结构体从未被定义,子虚乌有,只在这里随便声明了一下。gcc test.c的结果是编译成功。编译器承认这个结构体指针的合法性,但是此时要是试图访问指针里面的内容(比如p->i
),显然会编译出错。
回到a.c代码,对编译起来说,
struct stb
*pb也仅仅是声明出来的变量,想要在a.c文件中访问里面的参数,门儿都没有。
解决方法是在b.c文件中访问pb指向的内存的参数,代码如下:
- # cat a.c
- #include <stdio.h>
- #include "b.h"
- void main()
- {
- struct stb *pb;
- pb = set_b(1);
- PRINT_PB(pb);
- }
- # cat b.c
- #include <stdlib.h>
- #include <stdio.h>
- #include "b.h"
- struct stb{
- int i;
- };
- struct stb *set_b(int num)
- {
- struct stb *pb = NULL;
- pb = (struct stb*)calloc(1, sizeof(struct stb));
- pb->i = num;
- return pb;
- }
- void PRINT_PB(struct stb *p)
- {
- printf("%d\n", p->i);
- }
- # cat b.h
- #ifndef __B_H
- #define __B_H
- struct stb *set_b(int i);
- void PRINT_PB(struct stb *p);
- #endif
执行结果:
阅读(1915) | 评论(0) | 转发(1) |