#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结构时没有问题?
答案 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 *。
的函数