即使未声明它们,也在C中使用struct指针

时间:2013-01-08 14:32:11

标签: c pointers struct

#include <stdlib.h>

struct timer_list
{
};

int main(int argc, char *argv[])
{
  struct foo *t = (struct foo*) malloc(sizeof(struct timer_list));
  free(t);
  return 0;
}

为什么上面的代码段编译(在gcc中)并且在我没有定义foo结构时没有问题?

2 个答案:

答案 0 :(得分:7)

因为在上面的代码片段中,编译器不需要知道struct foo的大小,只需知道{strong>指针到struct foo的大小,这是独立的结构的实际定义。

现在,如果你写了:

struct foo *t = malloc(sizeof(struct foo));

这将是一个不同的故事,因为现在编译器需要知道要分配多少内存。

此外,如果您在某个时刻尝试访问struct foo*的成员(或取消引用指向foo的指针):

((struct foo*)t)->x = 3;

编译器也会抱怨,因为此时它需要知道x结构的偏移量。


另外,此属性对于实现Opaque Pointer很有用。

答案 1 :(得分:0)

“那么free(t)怎么样?编译器可以在不知道结构的实际大小的情况下释放内存吗?” 不,编译器不会释放任何东西。 Free()只是一个输入参数为void *。

的函数